В Python-е списки один из самых используемых типов
данных. Они отдаленно напоминают массивы в Java или C — это тоже
упорядоченный список объектов. В частности, аналогию можно провести с
массивом в Java — с классом Vector, который способен содержать
произвольные объекты. Питоновские списки можно также сравнить с
массивами на языке Perl. По своей мощи, гибкости, простоте использования
список превосходит аналоги из других языков программирования.
В этой заметке будут рассмотрены следующие темы.
Для группировки множества элементов в питоне используется список list, который может быть записан как индексированная последовательность значений, разделенных запятыми, заключенная в квадратные скобки. Списки имеют произвольную вложенность, т.е. могут включать в себя любые вложенные списки. Физически список представляет собой массив указателей (адресов) на его элементы. С точки зрения производительности (performance) списки имеют следующие особенности.
Как и для строк, для списков нумерация индексов начинается с нуля. Для списка можно получить срез, объединить несколько списков и так далее:
Можно менять как отдельные элементы списка, так и диапазон:
Вставка:
Можно сделать выборку из списка с определенной частотой:
2. Операции со списками
К операциям мы относим:
Умножение, или повтор списков:
Итерацию списков в питоне можно делать несколькими различными способами:
Конструктор может быть условным — найдем квадраты четных натуральных чисел:
С помощью конструктора решим конкретную задачу — отсортируем слова в предложении в порядке их длительности:
Операция Sequence unpacking — присваивание списку переменных списка значений:
3. Встроенные функции
Списки имеют большой набор функций:
Элемент можно добавить в произвольную позицию списка с помощью метода
Для проверки, является ли элемент членом списка, есть оператор
При удалении нужно помнить о том, что нельзя одновременно делать итерацию по списку — последствия будут непредсказуемы.
4. Стек и очереди
Список можно использовать как стек — когда последний добавленный элемент извлекается первым (LIFO, last-in, first-out). Для извлечения элемента с вершины стека есть метод
Список можно использовать как очередь — элементы извлекаются в том же порядке, в котором они добавлялись (FIFO, first-in, first-out). Для извлечения элемента используется метод
5. Кортежи (Tuple)
Список так же может быть неизменяемым (
Функция
6. Сеты (Set)
Сеты — неотсортированная коллекция уникальных элементов. Сеты поддерживают итерацию, добавление и удаление объектов и т.д. Индексация и срезы в сетах не поддерживаются. Сгенерировать сет можно с помощью функции:
Над сетами можно выполнять разные операции, например:
add() — добавление элемента:
remove() — удаление элемента:
Итерация:
Сеты можно использовать для фильтрации дублей в коллекциях. Для этого коллекцию нужно сконвертировать в сет, а потом обратно:
Сеты можно использовать для работы с большими наборами данных:
допустим, у нас имеются базы данных программистов и менеджеров:
Найти тех, кто одновременно и программист, и менеджер:
Найти всех программистов и менеджеров:
Найти программистов, которые не менеджеры:
7. Встроенные функции filter(), map(), zip(), reduce().
Можно перебирать элементы одновременно нескольких последовательностей одной длины:
В этой заметке будут рассмотрены следующие темы.
- Что такое список.
- Операции со списками.
- Встроенные функции.
- Стек и очередь.
- Кортежи (Tuple).
- Сеты (Set).
- Встроенные функции
filter(), map(), zip(), reduce()
.
Для группировки множества элементов в питоне используется список list, который может быть записан как индексированная последовательность значений, разделенных запятыми, заключенная в квадратные скобки. Списки имеют произвольную вложенность, т.е. могут включать в себя любые вложенные списки. Физически список представляет собой массив указателей (адресов) на его элементы. С точки зрения производительности (performance) списки имеют следующие особенности.
- Время доступа к элементу есть величина постоянная и не зависит от размера списка.
- Время на добавление одного элемента в конец списка есть величина постоянная.
- Время на вставку зависит от того, сколько элементов находится справа от него, т.е. чем ближе элемент к концу списка, тем быстрее идет его вставка.
- Удаление элемента происходит так же, как и в пункте 3.
- Время, необходимое на реверс списка, пропорционально его размеру —
O(n)
. - Время, необходимое на сортировку, зависит логарифмически от размера списка.
>>> lst = ['spam', 'drums', 100, 1234] |
Как и для строк, для списков нумерация индексов начинается с нуля. Для списка можно получить срез, объединить несколько списков и так далее:
>>> lst[1:3] ['drums', 100] |
Можно менять как отдельные элементы списка, так и диапазон:
>>> lst[3] = 'piano' >>> lst[0:2] = [1,2] >>> lst [1, 2, 100, 'piano'] |
Вставка:
>>> lst[1:1] = ['guitar','microphone'] >>> lst [1, 'guitar', 'microphone', 2, 100, 'piano'] |
Можно сделать выборку из списка с определенной частотой:
>>> numbers = [1,2,3,4,5,6,7,8,9,0] >>> numbers[::4] [1, 5, 9] |
2. Операции со списками
К операциям мы относим:
- копирование списка;
- сложение и умножение списков;
- итерацию — проход в цикле по элементам списка;
- конструктор списков (list comprehension);
- распаковку списка — sequence unpacking.
L1 = L2[:]
— создание второй копии списка. Здесь создается вторая копия обьекта.L1 = list(L2)
— тоже создание второй копии списка.L1 = L2
— создание второй ссылки, а не копии. 3-й вариант показывает, что создаются две ссылки на один и тот же обьект, а не две копии.
L1 + L2 |
Умножение, или повтор списков:
L1 * 2 |
Итерацию списков в питоне можно делать несколькими различными способами:
- простая итерация списка:
for x in L:
- сортированная итерация:
for x in sorted(L):
- уникальная итерация:
for x in set(L):
- итерация в обратном порядке:
for x in reversed(L):
- исключающая итерация — например, вывести элементы 1-го списка, которых нет во 2-м списке:
for item in set(L).difference(L2)
>>> a = [ i*i for i in range(1,10)] >>> a [1, 4, 9, 16, 25, 36, 49, 64, 81] |
Конструктор может быть условным — найдем квадраты четных натуральных чисел:
>>> a = [ i*i for i in range(1,10) if i % 2 == 0] >>> a [4, 16, 36, 64] |
С помощью конструктора решим конкретную задачу — отсортируем слова в предложении в порядке их длительности:
words = ' to perform the task of sorting the words in a string by their length'.split() wordlens = [(len(word), word) for word in words] wordlens.sort() print ' '.join(w for (_, w) in wordlens) >>> a by in of to the the task their words length string perform sorting |
Операция Sequence unpacking — присваивание списку переменных списка значений:
a, b = [1,2] |
3. Встроенные функции
Списки имеют большой набор функций:
append , extend
— добавление;insert
— вставка;index
— найти индекс первого вхождения конкретного элемента;count
— подсчет повторов элемента;remove , del
— удаление элемента;sort
— сортировка;reverse
— реверс;pop
— извлечение элемента;len
— длина списка;max
— максимальный элемент;min
— минимальный элемент;- оператор
in
— проверка элемента на вхождение.
append()
:>>> lst = [1, 'guitar', 'microphone', 2, 100, 'piano'] >>> lst2 = ['sintezator','drums'] >>> lst.append(lst2) >>> lst [1, 'guitar', 'microphone', 2, 100, 'piano', ['sintezator', 'drums']] |
Элемент можно добавить в произвольную позицию списка с помощью метода
insert
:>>> lst.insert(0,'vocal') >>> lst ['vocal', 1, 'guitar', 'microphone', 2, 100, 'piano', ['sintezator', 'drums']] |
Для проверки, является ли элемент членом списка, есть оператор
in
:>>> 2 in lst True >>> 10 in lst False |
index()
— взять элемент списка по индексу:>>> lst.index('guitar') 2 |
count()
— подсчет числа повторов какого-то элемента: >>> lst.count('vocal') 1 |
remove()
— удаление конкретного элемента: >>> lst.remove(100) >>> lst ['vocal', 1, 'guitar', 'microphone', 2, 'piano', ['sintezator', 'drums']] |
del
— удаление по индексу:del lst[1] |
При удалении нужно помнить о том, что нельзя одновременно делать итерацию по списку — последствия будут непредсказуемы.
sort()
— сортировка списка:>>> lst.sort() >>> lst [1, 2, ['sintezator', 'drums'], 'guitar', 'microphone', 'piano', 'vocal'] |
reverse()
— реверс списка:>>> lst.reverse() >>> lst ['vocal', 'piano', 'microphone', 'guitar', ['sintezator', 'drums'], 2, 1] |
pop()
— извлечение элемента из списка, функция без
параметра удаляет по умолчанию последний элемент списка, в качестве
параметра можно поставить произвольный индекс:>>> lst.pop() >>> lst ['vocal', 'piano', 'microphone', 'guitar', ['sintezator', 'drums'], 2] |
len()
— длина списка:>>> len(lst) 6 |
max()
— максимальный элемент списка:>>> max(lst) 'vocal' |
min()
— минимальный элемент списка:>>> min(lst) 2 |
extend()
— аналогичен append()
, добавляет последовательность элементов: >>> lst.extend([3,4]) >>> lst ['vocal', 'piano', 'microphone', 'guitar', ['sintezator', 'drums'], 2, 3, 4] |
4. Стек и очереди
Список можно использовать как стек — когда последний добавленный элемент извлекается первым (LIFO, last-in, first-out). Для извлечения элемента с вершины стека есть метод
pop()
:>>> stack = [1,2,3,4,5] >>> stack.append(6) >>> stack.append(7) >>> stack.pop() >>> stack [1, 2, 3, 4, 5, 6] |
Список можно использовать как очередь — элементы извлекаются в том же порядке, в котором они добавлялись (FIFO, first-in, first-out). Для извлечения элемента используется метод
pop()
с индексом 0
:>>> queue = ['rock','in','roll'] >>> queue.append('alive') >>> queue.pop(0) >>> queue ['in', 'roll', 'alive'] |
5. Кортежи (Tuple)
Список так же может быть неизменяемым (
immutable
), как и строка, в этом случае он
называется кортеж (tuple
). Кортеж использует меньше памяти,
чем список. Кортеж вместо квадратных скобок использует круглые (хотя
можно и совсем без скобок). Кортеж не допускает изменений, в него нельзя
добавить новый элемент, хотя он может содержать объекты, которые можно
изменить:>>> t = 1,[2,3] >>> t (1, [2, 3]) >>> t[1] = 2 TypeError: 'tuple' object does not support item assignment >>> t[1].append(4) >>> t (1, [2, 3, 4]) |
Функция
tuple()
берет в качестве аргумента строку или список и превращает его в кортеж:>>> tuple('abc') ('a', 'b', 'c') |
6. Сеты (Set)
Сеты — неотсортированная коллекция уникальных элементов. Сеты поддерживают итерацию, добавление и удаление объектов и т.д. Индексация и срезы в сетах не поддерживаются. Сгенерировать сет можно с помощью функции:
>>> s = set('abcde') >>> s set(['a', 'c', 'b', 'e', 'd']) >>> s2 = set('aghij') >>> s2 set(['a', 'h', 'j', 'g', 'f']) |
Над сетами можно выполнять разные операции, например:
- вычитание:
>>> s3 = s - s2 >>> s3 set(['c', 'b', 'e', 'd'])
- сложение:
>>> s3 = s | s2 >>> s3 set(['a', 'c', 'b', 'e', 'd', 'g', 'i', 'h', 'j'])
- пересечение:
>>> s3 = s & s2 >>> s3 set(['a'])
add() — добавление элемента:
>>> s.add(6) >>> s set(['a', 'c', 'b', 'e', 'd', 6]) |
remove() — удаление элемента:
>>> s.remove('a') >>> s set(['c', 'b', 'e', 'd', 6]) |
Итерация:
>>> for item in s:print (item) c b e d 6 |
Сеты можно использовать для фильтрации дублей в коллекциях. Для этого коллекцию нужно сконвертировать в сет, а потом обратно:
>>> L = [1,2,3,4,1,2,6,7] >>> set(L) set([1, 2, 3, 4, 6, 7]) >>> L = list(set(L)) >>> L [1, 2, 3, 4, 6, 7] |
Сеты можно использовать для работы с большими наборами данных:
допустим, у нас имеются базы данных программистов и менеджеров:
>>> programmers = set(['ivanov','petrov','sidorov']) >>> managers = set(['ivanov','moxov','goroxov']) |
Найти тех, кто одновременно и программист, и менеджер:
>>> programmers & managers set(['ivanov']) |
Найти всех программистов и менеджеров:
>>> programmers | managers set(['ivanov', 'petrov', 'sidorov', 'goroxov', 'moxov']) |
Найти программистов, которые не менеджеры:
>>> programmers - managers set(['petrov', 'sidorov']) |
7. Встроенные функции filter(), map(), zip(), reduce().
filter(function, sequence)
возвращает
последовательность, состоящую из тех элементов последовательности
sequence, для которых function(item) является истиной. Функция
применяется для каждого элемента последовательности. Пример: определим
простые числа в диапазоне до 100:def f(x): for y in xrange(2, x): if x%y==0: return 0 return 1 print filter(f, xrange(2, 100)) >>> [2, 3, 5, 7, 11, 13, 17, 19, 23, ... , 59, 61, 67, 71, 73, 79, 83, 89, 97] |
map(function, sequence)
возвращает список значений,
полученных применением функции function к элементам одной или нескольких
последовательностей. Например, создадим список кубов натуральных чисел
от 1 до 10:def cube(x): return x*x*x print map(cube, xrange(1, 11)) |
Можно перебирать элементы одновременно нескольких последовательностей одной длины:
seq1 = [1,2,3] seq2 = [11,12,13] for x, y in map(None, seq1, seq2): print x, y >>> 1 11 >>> 2 12 >>> 3 13 |
zip(sequence)
— функция, аналогичная map()
в последнем варианте, но может работать с последовательностями разной длины, возвращает список кортежей:>>> a = (1, 2, 3, 4) >>> b = (5, 6, 7, 8) >>> zip(a, b) [(1, 5), (2, 6), (3, 7), (4, 8)] |
reduce(function, sequence)
возвращает значение, полученное путем последовательного применения бинарной функции function
сначала к первым двум элементам последовательности sequence, затем к
результату и следующему элементу и т. д. Например, вычислим сумму
арифметической последовательности:>>> def add(x, y): return x+y ... >>> reduce(add, xrange(1, 11)) 55