Освой Python играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Python: List (Списки)

Фильтрация списка через filter() с лямбдой
Проекция на список через map() с лямбдой
Вырезка последовательности

Список – это структура данных, которая содержит упорядоченный набор элементов, т.е. хранит последовательность элементов. Изменяемые списки создаются через квадратные скобки. Элементы могут повторяться и меняться. Доступ к отдельному элементу тоже через квадратные скобки. Отсчёт с 0.

Узнать все методы списка можно через команду.


help(list)

Рассмотрим некоторые примеры.


cats = ["Барсик", "Мурзик", "Васька"]
print(cats) # все элементы списка
print(cats[1]) # один указанный элемент

numbers = [0, 1, 2, 3, 4, 5]
print(numbers)
print(numbers[4])

// список из строки
mylist = list('Барсик')
print(mylist)

В списке могут быть разные типы. Поместим в список числа и строки.


mix = ["one", 3, "two", "three", 9, 3]
print(mix[1])
print(mix[2])

Можно создать пустой список.


empty = []
print(empty) # []

В качестве индекса можно указать отрицательные значения. Так индекс -1 вернёт последний элемент списка, -2 предпоследний и т.д.


numbers = [0, 1, 2, 3, 4, 5]
print(numbers[-1]) #5
print(numbers[-2]) #4
print(numbers[-3]) #3

Развернуть список можно через reverse().


reversed = [1, 2, 3, 4, 4]
reversed.reverse()
print (reversed) # [4, 4, 3, 2, 1]
kitten = list("Барсик")
kitten.reverse()
print(kitten) # ['к', 'и', 'с', 'р', 'а', 'Б']

Сортировать можно через sort().


mylist = [8, 2, 11, 4, 3]
mylist.sort()
print (mylist)

Можем заменить существующие элементы списка.


numbers = [0, 1, 2, 3, 4, 5]
numbers[0] = 10
numbers[5] = 22
print(numbers[-1])
print(numbers[0])

Добавить новый элемент в конец списка можно через append().


numbers = [0, 1, 2, 3, 4, 5]
numbers.append(99)
print(numbers[-1])

Можно вставить элемент в нужную позицию через insert(), указав индекс.


numbers = [0, 1, 2, 3, 4, 5]
numbers = [0, 1, 2, 3, 4, 5]
numbers.insert(1, 33)
print(numbers[1])
print(numbers) # [0, 33, 1, 2, 3, 4, 5]

Удалить элемент по указанному индексу можно через remove().


numbers = [0, 1, 2, 3, 4, 5]
numbers.remove(5)
print(numbers) # [0, 1, 2, 3, 4]

Метод pop() также позволяет удалить элемент по индексу, но при этом возвращает значение удалённого элемента. Если индекс не указан, то удаляется последний элемент.


numbers = [6, 3, 9, 5, 1, 5]
poped = numbers.pop(2)
print(poped) # 9

poped = numbers.pop()
print(poped) # 5

Есть ещё способ удаления по индексу через инструкцию del.

Когда удаляется элемент с индексом 1, элемент, имевший индекс 2, становится элементом с индексом 1, элемент, имевший индекс 3, приобретает индекс 2 и так далее. Соответственно, количество индексов при удалении элемента уменьшается.

Можно запускать команду del numbers[1] снова и снова, удаляя по одному элементу списка. Главное, это вовремя остановиться, чтобы не получить ошибку при удалении несуществующего индекса.

Длину списка можно узнать через len().


numbers = [6, 8, 2, 5, 1, 5]
print(len(numbers)) # 6

Узнать количество одинаковых элементов в списке можно через count().


kitten = list('котёнок')
print(kitten.count('к')) # 2

Список можно расширить другим списком через extend(). Новые элементы добавляются в конец первого списка.


oneList = [6, 8, 2, 5, 1, 5]
secondList = [0, 1, 4]
oneList.extend(secondList)
print(oneList) # [6, 8, 2, 5, 1, 5, 0, 1, 4]

Два списка можно сложить и получить третий список.


firstList = [6, 8, 2, 5, 1, 5]
secondList = [0, 1, 4]
bigList = firstList + secondList
print(bigList) # [6, 8, 2, 5, 1, 5, 0, 1, 4]

Пройтись по всем элементам списка можно через цикл for.


numbers = [1, 2, 3]
for element in numbers:
  print(element)

Фильтрация списка через filter() с лямбдой

Мы можем фильтровать элементы списка по заданному условию, используя класс filter и лямбда-выражения.

Допустим, у нас есть список чисел от 1 до 10 и мы хотим оставить числа меньше 5. Применяем к списку функцию filter(), в котором указываем лямбда-выражение - берётся каждый элемент списка и проверяется условие. Если число меньше 5, то условие выполняется и число попадает в объект класса filter. Затем мы создаём новый список, куда помещаем созданный объект и на выходе получаем финальный результат - отфильтрованный список.


sourceList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
filterObj = filter(lambda x: x < 5, sourceList)
print(type(filterObj)) # <class 'filter'>
filteredList = list(filterObj)
print(filteredList) # [1, 2, 3, 4]

Существует другой громоздкий вариант через цикл for, который не стал приводить здесь.

Вместо лямбда-выражения можно использовать именную функцию. Создадим именную функцию под именем isGreater и зададим условие - числа должны быть больше 5.


def isGreater(x):
    return x > 5

sourceList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
filteredList = list(filter(isGreater, sourceList))
print(str(filteredList))

Проекция на список через map() с лямбдой

Если нужно пройтись по всем элементам списка и что-то с ним сделать, то подойдёт функция map(). Допустим, мы хотим увеличить значение каждого элемента на заданную величину.


sourceList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
mapObj = map(lambda x: x + 9, sourceList)
print(type(mapObj)) # <class 'map'>
mappedList = list(mapObj)
print(mappedList) # [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

Вырезка последовательности

Вырезка последовательности (получение фрагмента) применима к спискам, кортежам и строкам. Иногда используется термин "срез".


item[START:STOP:STEP]

Операция вырезки производится при помощи указания имени последовательности, за которым идёт пара чисел в квадратных скобках, разделённых двоеточием. Третий аргумент отвечает за шаг и используется реже (см. ниже).

Первое число перед двоеточием указывает позицию начала вырезки, а второе число после двоеточия указывает, где вырезка заканчивается. Если первое число не указано, вырезка начинается с начала последовательности. Если пропущено второе число, Python закончит вырезку у конца последовательности. Обратите внимание, что полученная вырезка будет начинаться с указанной начальной позиции, а заканчиваться прямо перед указанной конечной позицией, т.е. начальная позиция входит в вырезку, а конечная – нет.


sourceList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

print(sourceList[1:4])  # со второго до четвёртого
print(sourceList[5:])   # с шестого элемента до конца
print(sourceList[1:-1]) # со второго до предпоследнего
print(sourceList[:])    # все элементы

[2, 3, 4] [6, 7, 8, 9, 10] [2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Можно указать шаг вырезки в третьем аргументе (по умолчанию шаг вырезки равен 1):


sourceList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

print(sourceList[1:8:2])  # [2, 4, 6, 8]

с помощью срезов можно не только извлекать элементы, но и добавлять и удалять элементы (только для изменяемых списков).


sourceList = [1, 2, 3, 4, 5]
sourceList[1:3] = [7, 7, 7] # добавим три новых элемента вместо второго и третьего элемента
print(sourceList) # [1, 7, 7, 7, 4, 5]
del sourceList[:-3] # удаляем первые элементы списка до третьего элемента с конца
print(sourceList) # [7, 4, 5]
Реклама