Добавление элементов в список
Существует четыре способа добавить элементы в список.
>>> a_list = ['a']
>>> a_list = a_list + [2.0, 3] ①
>>> a_list ②
['a', 2.0, 3]
>>> a_list.append(True) ③
>>> a_list
['a', 2.0, 3, True]
>>> a_list.extend(['four', 'Ω']) ④
>>> a_list
['a', 2.0, 3, True, 'four', 'Ω']
>>> a_list.insert(0, 'Ω') ⑤
>>> a_list
['Ω', 'a', 2.0, 3, True, 'four', 'Ω']
① | Оператор + соединяет списки, создавая новый список. Список может содержать любое число элементов; ограничений размера не существует (пока есть доступная память). Однако, если вы заботитесь о памяти, знайте, что сложение списков создает ещё один список в памяти. В данном случае, этот новый список немедленно присваивается существующей переменной a_list. Так что эта строка кода, на самом деле, реализует двухэтапный процесс — сложение, а затем присвоение — который может (временно) потребовать много памяти, если вы имеете дело с большими списками. |
② | Список может содержать элементы любых типов, и элементы одного списка не обязательно должны быть одного и того же типа. Здесь мы видим список, содержащий строку, число с плавающей точкой и целое число. |
③ | Метод append() добавляет один элемент в конец списка. (Теперь у нас в списке присутствуют четыре различных типа данных!) |
④ | Списки реализованы как классы. «Создание» списка — это фактически создание экземпляра класса. Т. о., список имеет методы, которые работают с ним. Метод extend() принимает один аргумент — список, и добавляет каждый его элемент к исходному списку. |
⑤ | Метод insert() вставляет элемент в список. Первым аргументом является индекс первого элемента в списке, который будет сдвинут новым элементом со своей позиции. Элементы списка не обязаны быть уникальными; например, теперь у нас есть два различных элемента со значением 'Ω': первый элемент a_list[0] и последний элемент a_list[6]. |
В Python конструкция a_list.insert(0, value) действует как функция unshift() в Perl. Она добавляет элемент в начало списка, а все другие элементы увеличивают свой индекс на единицу, чтобы освободить пространство. |
Давайте подробнее рассмотрим разницу между append() и extend().
>>> a_list = ['a', 'b', 'c']
>>> a_list.extend(['d', 'e', 'f']) ①
>>> a_list
['a', 'b', 'c', 'd', 'e', 'f']
>>> len(a_list) ②
6
>>> a_list[-1]
'f'
>>> a_list.append(['g', 'h', 'i']) ③
>>> a_list
['a', 'b', 'c', 'd', 'e', 'f', ['g', 'h', 'i']]
>>> len(a_list) ④
7
>>> a_list[-1]
['g', 'h', 'i']
① | Метод extend() принимает один аргумент, который всегда является списком, и добавляет каждый элемент этого списка к a_list. |
② | Если вы возьмёте список из трёх элементов и расширите его списком из ещё трёх элементов, в итоге получится список из шести элементов. |
③ | С другой стороны, метод append() получает единственный аргумент, который может быть любого типа. Здесь мы вызываем метод append(), передавая ему список из трёх элементов. |
④ | Если вы возьмёте список из шести элементов и добавите к нему список, в итоге вы получите... список из семи элементов. Почему семь? Потому что последний элемент (который мы только что добавили) является списком. Списки могут содержать любые типы данных, включая другие списки. Возможно, это то, что вам нужно, возможно, нет. Но это то, что вы просили, и это то, что вы получили. |
Поиск значений в списке
>>> a_list = ['a', 'b', 'new', 'mpilgrim', 'new']
>>> a_list.count('new') ①
2
>>> 'new' in a_list ②
True
>>> 'c' in a_list
False
>>> a_list.index('mpilgrim') ③
3
>>> a_list.index('new') ④
2
>>> a_list.index('c') ⑤
Traceback (innermost last):
File "<interactive input>", line 1, in ?
ValueError: list.index(x): x not in list
Перевод сообщения оболочки:
Раскрутка стека (от внешних к внутренним):
Файл "<интерактивный ввод>", строка 1, позиция ?
ValueError: list.index(x): x не в списке
① | Как вы наверное ожидаете, метод count возвращает количество вхождений указанного значения в список. |
② | Если всё, что вам нужно — это узнать, присутствует ли значение в списке или нет, тогда оператор in намного быстрее, чем метод count(). Оператор in всегда возвращает True или False; он не сообщает, сколько именно в списке данных значений. |
③ | Если вам необходимо точно знать, на каком месте в списке находится какое-либо значение, то используйте метод index(). По умолчанию, он просматривает весь список, но вы можете указать вторым аргументом индекс (отсчитываемый от нуля), с которого необходимо начать поиск, и даже третий аргумент — индекс, на котором необходимо остановить поиск. |
④ | Метод index() находит только первое вхождение значения в списке. В данном случае 'new' встречается дважды в списке: в a_list[2] и a_list[4], но метод index() вернёт только индекс первого вхождения. |
⑤ | Вопреки вашим ожиданиям, если значение не найдено в списке, то метод index() возбудит исключение.[waр-robіn.сom] |
Постойте, что? Да, верно: метод index() возбуждает исключение, если не может найти значение в списке. Вы наверное заметили отличие от большинства других языков, которые возвращают какой-нибудь неверный индекс (например, -1). Если на первый взгляд это может немного раздражать, то, я думаю, в будущем вы примете этот подход. Это означает, что ваша программа будет аварийно завершена в том месте, где возникла проблема, вместо того чтобы тихо перестать работать в каком-нибудь другом месте. Запомните, -1 тоже является подходящим индексом для списков. Если бы метод index() возвращал -1, вас могли ожидать невесёлые вечера, потраченные на поиск ошибок в коде!