структура данных
список
Используйте списки как стопки
Метод list позволяет удобно использовать список в качестве стека, который представляет собой особую структуру данных, в которой первый введенный элемент освобождается последним (последний вошел первым). Используйте метод append(), чтобы добавить элемент на вершину стека. Используйте метод pop() без указания индекса, чтобы освободить элемент из вершины стека. Например:
>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]
Используйте списки в качестве очередей
Список можно использовать и как очередь, но первый элемент, добавленный в очередь, будет первым извлекаться, а использовать список для этой цели неэффективно. Добавление или извлечение элементов в конец списка выполняется быстро, но вставка или извлечение из начала списка — не так быстро (поскольку все остальные элементы должны перемещаться один за другим).
>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry") # Terry arrives
>>> queue.append("Graham") # Graham arrives
>>> queue.popleft() # The first to arrive now leaves
'Eric'
>>> queue.popleft() # The second to arrive now leaves
'John'
>>> queue # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])
понимание списка
Генераторы списков обеспечивают простой способ создания списков из последовательностей. Обычно приложение применяет некоторую операцию к каждому элементу последовательности и использует полученный результат как элемент для создания нового списка или для создания подпоследовательности на основе определенных предикатов. За каждым включением списка следует выражение, за которым следует ноль или более предложений for или if. Возвращаемый результат — это список, сгенерированный из контекста for и, если он следует, в соответствии с выражением. Если вы хотите, чтобы выражение выводило кортеж, вы должны использовать круглые скобки. Здесь мы умножаем каждое значение в списке на три, чтобы получить новый список:
>>> vec = [2, 4, 6]
>>> [3*x for x in vec]
[6, 12, 18]
>>> [[x, x**2] for x in vec]
[[2, 4], [4, 16], [6, 36]]
>>> freshfruit = [' banana', ' loganberry ', 'passion fruit ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']
Используйте, если как фильтр:
>>> [3*x for x in vec if x > 3]
[12, 18]
>>> [3*x for x in vec if x < 2]
[]
Вот несколько демонстраций циклов и других трюков:
>>> vec1 = [2, 4, 6]
>>> vec2 = [4, 3, -9]
>>> [x*y for x in vec1 for y in vec2]
[8, 6, -18, 16, 12, -36, 24, 18, -54]
>>> [x+y for x in vec1 for y in vec2]
[6, 5, -7, 8, 7, -5, 10, 9, -3]
>>> [vec1[i]*vec2[i] for i in range(len(vec1))]
[8, 12, -54]
Включение списков может использовать сложные выражения или вложенные функции:
>>> [str(round(355/113, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']
Понимание вложенного списка
Списки Python также могут быть вложенными. В следующем примере показан матричный список 3x4:
>>> matrix = [
... [1, 2, 3, 4],
... [5, 6, 7, 8],
... [9, 10, 11, 12],
... ]
В следующем примере список матриц 3X4 преобразуется в список 4X3:
>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
Это также может быть достигнуто с помощью:
>>> transposed = []
>>> for i in range(4):
... transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
Другой способ сделать это:
>>> transposed = []
>>> for i in range(4):
... # the following 3 lines implement the nested listcomp
... transposed_row = []
... for row in matrix:
... transposed_row.append(row[i])
... transposed.append(transposed_row)
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
оператор del
Используйте оператор del для удаления элемента из списка по индексу, а не по значению. Это не то же самое, что использовать pop() для возврата значения. Вырез можно удалить из списка с помощью оператора del, или можно очистить весь список (метод, который мы представили ранее, состоит в том, чтобы присвоить вырезу пустой список). Например:
>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.25, 1234.5]
>>> del a[:]
>>> a
[]
Переменные сущности также можно удалить с помощью del:
>>> del a
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
Кортежи и последовательности
Кортеж состоит из значений, разделенных запятыми, например:
>>> t = 12345, 54321, 'hello!'
>>> t[0]
12345
>>> t
(12345, 54321, 'hello!')
>>> # Tuples may be nested:
... u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))
Как видите, кортежи всегда выводятся со скобками, чтобы правильно выразить вложенные структуры. Во входных данных могут быть или не быть круглые скобки, но обычно они необходимы (если кортеж является частью более крупного выражения).
собирать
Набор — это неупорядоченный набор неповторяющихся элементов. Основные функции включают проверку взаимосвязей и устранение повторяющихся элементов. Коллекции можно создавать с помощью фигурных скобок ({}). Примечание: если вы хотите создать пустой набор, вы должны использовать set() вместо {}; последний создает пустой словарь, и мы рассмотрим эту структуру данных в следующем разделе. Вот простая демонстрация:
>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket) # 删除重复的
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket # 检测成员
True
>>> 'crabgrass' in basket
False
>>> # 以下演示了两个集合的操作
...
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a # a 中唯一的字母
{'a', 'r', 'b', 'c', 'd'}
>>> a - b # 在 a 中的字母,但不在 b 中
{'r', 'd', 'b'}
>>> a | b # 在 a 或 b 中的字母
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b # 在 a 和 b 中都有的字母
{'a', 'c'}
>>> a ^ b # 在 a 或 b 中的字母,但不同时在 a 和 b 中
{'r', 'd', 'b', 'm', 'z', 'l'}
Коллекции также поддерживают понимание:
>>> a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}
Словарь
Еще одним очень полезным встроенным типом данных в Python является словарь. В отличие от последовательностей, которые индексируются последовательными целыми числами, словари индексируются ключами, которые могут быть любого неизменяемого типа, обычно строки или числа. Лучший способ понять словарь — представить его как неупорядоченный набор пар ключ=>значение. В одном и том же словаре ключи должны отличаться друг от друга.Пара фигурных скобок создает пустой словарь: {}.Вот простой пример использования словаря:
>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
>>> list(tel.keys())
['irv', 'guido', 'jack']
>>> sorted(tel.keys())
['guido', 'irv', 'jack']
>>> 'guido' in tel
True
>>> 'jack' not in tel
False
Конструктор dict() строит словарь непосредственно из списка кортежей "ключ-значение". При наличии фиксированного шаблона списковые включения указывают определенные пары ключ-значение:
>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}
Если ключевые слова представляют собой простые строки, иногда удобнее указать пары ключ-значение с помощью аргументов ключевого слова:
>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}
Кроме того, понимание словаря можно использовать для создания словаря выражений с произвольными ключами и значениями:
>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}
Навыки обхода
При обходе словаря ключ и соответствующее значение можно интерпретировать одновременно с помощью метода items():
>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
... print(k, v)
...
gallahad the pure
robin the brave
При обходе последовательности позицию индекса и соответствующее значение можно получить одновременно с помощью функции enumerate():
>>> for i, v in enumerate(['tic', 'tac', 'toe']):
... print(i, v)
...
0 tic
1 tac
2 toe
Одновременное повторение двух или более последовательностей можно объединить с помощью zip() :
>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
... print('What is your {0}? It is {1}.'.format(q, a))
...
What is your name? It is lancelot.
What is your quest? It is the holy grail.
What is your favorite color? It is blue.
Чтобы пройти последовательность в обратном направлении, сначала укажите последовательность, а затем вызовите функцию reversed():
>>> for i in reversed(range(1, 10, 2)):
... print(i)
...
9
7
5
3
1
Чтобы просмотреть последовательность по порядку, используйте функцию sorted() для возврата отсортированной последовательности без изменения исходного значения:
>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for f in sorted(set(basket)):
... print(f)
...
apple
banana
orange
pear
О сортировке sorted() по умолчанию в порядке, см.:
>>> abc
{'a': 11, 'b': 12, 'c': 13, 'e': 15, 'd': 14}
>>> abc.keys()
dict_keys(['a', 'b', 'c', 'e', 'd'])
>>> sorted(abc.keys())
['a', 'b', 'c', 'd', 'e']
>>> abc['ab']=110
>>> abc.keys()
dict_keys(['a', 'b', 'c', 'e', 'd', 'ab'])
>>> sorted(abc.keys())
['a', 'ab', 'b', 'c', 'd', 'e']
>>> abc['ba']=100
>>> sorted(abc.keys())
['a', 'ab', 'b', 'ba', 'c', 'd', 'e']