Списки Python
Введение
list A built-in Python sequence. Despite its name it is more akin to an array in other languages than to a linked list since access to elements is O(1).
Известно, что список является встроенной в Python последовательностью. Если вы знакомы с другими языками программирования, то список
это приблизительный аналог массива.
Доступ к элементам O(1) означает что скорость, с которой вы запросив элемент по его индексу получите результат, равна одной операции.
Под каждый элемент списка выделен одинаковый размер памяти, например у меня это 8 байт. Когда вы вызываете элемент с индексом i
Python знает адрес памяти нулевого элемента списка и просто прибавляет к нему 8 умноженное на i
Список - это
изменяемый
объект.
Чтобы создать список нужно воспользоваться квадратными скобками []
lst = ['a', 'b', 'c']
print(lst)
['a','b','c']
Получился список из трёх элементов.
У каждого есть два уникальных индекса. Один индекс соответсвует обходу списка слева направо 0, 1, 2.
Второй соответствует обходу в обратную сторону -0, -1, -2
Индекс 'a' = 0 либо -0, индекс 'b' = 1 либо -2, индекс 'c' = 2 либо -1.
Можно пользоваться индексом и в обратную сторону. Тогда индекс c = -1, индекс b = -2, индекс a = -3
Элемент | a | b | c |
---|---|---|---|
Индекс | 0 | 1 | 2 |
Индекс - | -3 | -2 | -1 |
Обрезать список
При использовании слайсов вида
[x:y]
Элементом с индексом x включается а y нет.
Рассмотрим список
l = [100, 200, 300, 400, 500]
print(l[1:3])
[200, 300]
Элемент с индексом 3 это 400 и он не попал в результат.
Можно использовать заведомо несуществующий индекс. Если он справа слайс будет продолжен до последнего элемента. Если он слева то вернётся пустой список. Exception не появится.
print("l[:10]:\n", l[:10]) print("l[10:]:\n", l[10:]) print("l[10:2]:\n", l[10:2])
l[:10]: [100, 200, 300, 400, 500] l[10:] [] l[10:2] []
l = [100, 200, 300, 400, 500] print("l: ", l) print("l[0]:\n", l[0]) print("l[-0]:\n", l[-0]) print("l[1]:\n", l[1]) print("l[-1]:\n", l[-1]) print("l[1:3]:\n", l[1:3]) print("l[1:-1]:\n", l[1:-1]) print("l[2:]:\n", l[2:]) print("l[:2]:\n", l[:2]) print("l[:10]:\n", l[:10]) print("l[10:]:\n", l[10:]) # All list elements print("l[:]:\n", l[:])
l: [100, 200, 300, 400, 500] l[0]: 100 l[-0]: 100 l[1]: 200 l[-1]: 500 l[1:3]: [200, 300] l[1:-1]: [200, 300, 400] l[2:]: [300, 400, 500] l[:2]: [100, 200] l[:]: [100, 200, 300, 400, 500] l[:10]: [100, 200, 300, 400, 500] l[10:] []
append()
Чтобы добавить в конец списка новый элемент применяется метод append()
Операция
x.append("z")
эвивалентна
x[len(x):] = "z"
x.append("z") и x[len(x):] = "z" дадут одинаковый результат но в целом x.append(что-то) и x[len(x):] = что-то - не являются полными аналогами так как если что-то - это
Пример
x = ['a','b','c'] x.append('d') print(x) print(len(x)) x[len(x):] = 'e' print(x) print(len(x))
['a','b','c','d'] 4 ['a','b','c','d','e'] 5
Нужно понимать, что .append() добавляет что-то как один последний элемент списка.
То есть, если вы хотите совместить два списка .append() вместо этого запишет второй список как последний элемент первого.
first = ['a', 'b'] second = ['c', 'd'] first.append(second) print(first)
['a', 'b', ['c', 'd']]
Для соединения списков в один используется .extend()
Другие способы добавлять в список
>>> a = [0, 1, 2] >>> b = [3, 4, 5] >>> c = a + b >>> c [0, 1, 2, 3, 4, 5] >>> c += [6, 7, 8] >>> c [0, 1, 2, 3, 4, 5, 6, 7, 8] >>> c.extend([9, 10, 11]) >>> c [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
.extend()
list.extend(iterable) Extend the list by appending all the items from the iterable. Equivalent to a[len(a):] = iterable.
first = ['a', 'b'] second = ['c', 'd'] first.extend(second) print(first)
['a', 'b', 'c', 'd']
Копировать список
# Copy l = [100, 200, 300, 400, 500] t = l print("\n# t = l") print("t is l =", t is l) # True r = l[:] print("\n# r = l[:]") print("r is l = ", r is l) # False print("r == l = ", r == l) # True u = l.copy() print("\n# u = l.copy()") print("u is l = ", u is l) # False v = list(l) print("\n# v = list(l)") print("v is l = ", v is l) # False
# t = l t is l = True # r = l[:] r is l = False r == l = True # u = l.copy() u is l = False # v = list(l) v is l = False
a = [ [1, 2], [3, 4] ] b = a[:] print(a is b) # False print(a == b) # True print(a[0]) # [1, 2] print(b[0]) # [1, 2] print(a[0] is b[0]) # True a[0] = [8, 9] print(a[0]) # [8, 9] print(b[0]) # [1, 2] a[1].append(5) print(a[1]) # [3, 4, 5] print(b[1]) # [3, 4, 5] print(a) # [[8, 9], [3, 4, 5]] print(b) # [[1, 2], [3, 4, 5]]
False True [1, 2] [1, 2] True [8, 9] [1, 2] [3, 4, 5] [3, 4, 5] [[8, 9], [3, 4, 5]] [[1, 2], [3, 4, 5]]
К спискам можно применять умножение
s = [ [-1, +1] ] * 5 print(s) s[2].append(7) print(s)
[21, 37, 21, 37, 21, 37, 21, 37] [0, 0, 0, 0, 0, 0, 0, 0, 0]
Самое удивительное проявление того, что Python использует просто ссылки на объекты можно наблюдать как раз при создании списков умножением
s = [ [-1, +1] ] * 5 print(s) s[2].append(7) print(s)
[[-1, 1], [-1, 1], [-1, 1], [-1, 1], [-1, 1]] [[-1, 1, 7], [-1, 1, 7], [-1, 1, 7], [-1, 1, 7], [-1, 1, 7]]
Как видите семёрка добавилась везде, потому что был изменён исходный объект из которого умножением создавался список
w = "the heihei.ru website was forked from eth1.ru in 2018 simultaneously with the topbicyle.ru website".split() print(w) i = w.index('was') print(i) # 3 print(w[i]) # was print(w.count("the")) # 2 print("heihei.ru" in w) # True print("eth1.ru" not in w) # True
['the', 'heihei.ru', 'website', 'was', 'forked', 'from', 'eth1.ru', 'in', '2018', 'simultaneously', 'with', 'the', 'topbicyle.ru', 'website'] 3 was 2 True True
len()
Длину списка можно узнать с помощью функции len()
>>> l = ["Pluralsight",
"OTUS",
"GeekBrains"]
>>> print(len(l))
3
insert()
Чтобы добавить новый элемент в начало списка применяется метод insert()
lst.insert(0, 'z')
print(l)
['z','a','b','c','d']
print(len(lst))
5
С помощью insert() можно вставить элемент в любое место в списке
Нужно передать в insert() индекс того места в которое вы хотите поместить элемент
lst.insert(3, 'j')
print(lst)
['z','a','b','j','c','d']
print(len(lst))
6
split() и join()
Превратить строку в список можно с помощью split()
Собрать список в строку - с помощью join()
>>> s = 'Please visit website' >>> s 'Please visit website' >>> a = s.split() >>> a ['Please', 'visit', 'website'] >>> a.insert(2, "topbicycle.ru") >>> a ['Please', 'visit', 'topbicycle.ru', 'website'] >>> s = ' '.join(a) >>> s 'Please visit topbicycle.ru website'
Чтобы удалить последний элемент списка применяется метод pop()
lst = ['a', 'b', 'c']
lst.pop()
print(lst)
['a', 'b']
print(len(lst))
2
pop(0)
Чтобы удалить первый элемент списка
lst = ['a', 'b', 'c']
lst.pop(0)
print(lst)
['b', 'c']
print(len(lst))
2
Чтобы удалить произвольный элемент списка передайте в pop() его индекс
lst = ['a', 'b', 'c']
lst.pop(1)
print(lst)
['a', 'c']
print(len(lst))
2
del
Удалять элементы из списка можно с помощью del
>>> c = "Armenia Finland Georgia Germany Italy Norway Russia Spain Sweden".split() >>> c ['Armenia', 'Finland', 'Georgia', 'Germany', 'Italy', 'Norway', 'Russia', 'Spain', 'Sweden'] >>> del c[3] >>> c ['Armenia', 'Finland', 'Georgia', 'Italy', 'Norway', 'Russia', 'Spain', 'Sweden'] >>> c.remove('Norway') >>> c ['Armenia', 'Finland', 'Georgia', 'Italy', 'Russia', 'Spain', 'Sweden'] >>> del c[c.index('Sweden')] >>> c ['Armenia', 'Finland', 'Georgia', 'Italy', 'Russia', 'Spain']
reverse() и sort()
>>> d = [1, 5, 70] >>> d.reverse() >>> d [70, 5, 1] >>> e = [8, 3, 14] >>> e.sort() >>> e [3, 8, 14] >>> e.sort(reverse=True) >>> e [14, 8, 3]
>>> w = 'Please visit topbicycle.ru website'.split() >>> w ['Please', 'visit', 'topbicycle.ru', 'website'] >>> w.sort(key=len) >>> w ['visit', 'Please', 'website', 'topbicycle.ru']
>>> x = [4, 9, 2, 1] >>> y = sorted(x) >>> y [1, 2, 4, 9] >>> x [4, 9, 2, 1] >>> p = [9, 3, 1, 0] >>> q = reversed(p) >>> q <list_reverseiterator object at 0x7f93ddd42280> >>> list(q) [0, 1, 3, 9]
zip
С помощью функции zip() можно из двух списков создать список кортежей.
>>> languages = ['Java', 'Python', 'JavaScript'] >>> versions = [18, 3, 2015] >>> result = zip(languages, versions) >>> print(list(result))
[('Java', 18), ('Python', 3), ('JavaScript', 2015)]
Как создавать списки
С помощью []
Если нужно просто изменить тип переменной со строки на список достаточно заключить строку в квадратные скобки.
site = "testsetup.ru" print(type(site)) site = [site] print(type(site))
python str_to_list.py
<class 'str'> <class 'list'>
С помощью цикла for
Можно использовать цикл for для создания списка.
Это делается за три шага
- Создать пустой список
- Пройтись по итерируемому объекту или нескольким объектам.
- Дописать каждый элемент в конец списка
Если вы хотите создать список, содержащий первые десять полных квадратов, то вы можете выполнить эти шаги в трех строках кода:
>>> squares = [] >>> for i in range(10): ... squares.append(i * i) >>> squares
Или даже в двух
>>> squares = [] >>> for i in range(10): squares.append(i * i) >>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Сперва создаётся пустой список, squares.
Затем, с помощью цикла for происходит итерация по range(10).
Наконец, каждое число умножается само на себя и результат добавляется в конец списка.
С помощью map()
map()
предоставляет альтернативный подход, основанный на функциональном программировании.
В map() передаются функция и итерируемый объект и map()
создаёт новый итерируемый объект.
o = map(function, iterable)
Этот объект содежит вывод, который мог бы получится если бы к каждому элементу изначального итерируемого объекта применили данную функцию
В качестве примера рассмотрим ситуацию, в которой вам нужно рассчитать цену после уплаты налогов для списка транзакций:
txns = [1.11, 23.45, 45.5, 61.4] TAX_RATE = .08 def get_price_with_tax(txn): return txn * (1 + TAX_RATE) final_prices = map(get_price_with_tax, txns) print(list(final_prices))
[1.1988, 25.326, 49.14, 66.312]
Здесь у вас есть итеративный txns и функция get_price_with_tax(). Вы передаете оба этих аргумента в map() и сохраняете результирующий объект в final_prices.
Вы можете легко преобразовать этот объект карты в список с помощью функции list().
РЕКЛАМА от Яндекса. Может быть недоступна в вашем регионе
Конец рекламы. Если там пусто считайте это рекламой моей телеги
Абстракция списка
List Comprehension - Абстракция списков или списковое включение или генератор списков.
Третий способ создавать списки это абстракция списков.
С помощью этого элегантного похода можно переписать
цикл for из первого примера
всего в одну строку:
>>> squares = [i * i for i in range(10)] >>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Подробнее про этот способ вы можете прочитать в статье «List Comprehension в Python»
Встроенные коллекции | |
Списки [] | |
list comprehension: Генератор списков | |
Python | |
if, elif, else | |
Циклы | |
Генератор словарей | |
Генератор множеств |