Списки 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
Список - это
изменяемый
объект.
Чтобы
создать список
нужно воспользоваться квадратными скобками []
Другие способы
создания списков
в Python описаны в
этой статье
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 andreyolegovich.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("andreyolegovich.ru" not in w) # True
['the', 'heihei.ru', 'website', 'was', 'forked', 'from', 'andreyolegovich.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)]
Встроенные коллекции | |
Списки [] | |
Создать список | |
list comprehension: Генератор списков | |
Задачи | |
if, elif, else | |
Циклы | |
Генератор словарей | |
Генератор множеств |