Списки (list)
Если переменная одна, то её можно легко и просто объявить. А что если их несколько? Если нужно 100 или 200? Руками сложно набивать. Для этих целей, если не требуется что-то узкоспециализированное, используются встроенные структуры данных. Сегодня поговорим о списке (он же массив).
Объявление и получение доступа к данным
Массив, это структура данных, где переменные хранятся последовательно, у них нет имен, к ним можно обратиться по порядковому номеру хранения.
Например, у нас есть 10 пчел, у каждой есть свое имя. Создадим массив для хранения имен пчел.
bees_list = [
"Варвара", "Степанида", "Фёкла", "Марья", "Кузьминишна",
"Семённа", "Прасковья", "Радмила", "Таруся", "Антонина",
]
Массив объявляется квадратными скобками [], и внутри него могут храниться данные любых типов. Внутри квадратных скобок пробелы и табуляции не играют роли, так что можете позиционировать текст любым способом, что сочтете нужным.
Для того, что бы получить значение, нужно обратиться к массиву и указать позицию/индекс/отступ от края. Например, первое значение находится с отступом 0:
print(bees_list[0]) # Варвара
print(bees_list[1]) # Степанида
print(bees_list[9]) # Антонина
Если вы попробуете вызывать элемент № 10 в списке, получите ошибку, т.к. нет элемента со сдвигом 10.
Можно воспользоваться отрицательной нумерацией, тогда отсчет пойдет с конца массива, например:
print(bees_list[-1]) # Антонина
print(bees_list[-2]) # Таруся
Так же для доступа к элементам массива можно воспользоваться нотацией срезов: список[начало:окончание:шаг]. И не обязательно каждый из них указывать.
Например: Получить все элементы массива, которые расположены после третьего (Фёклы, в нашем случае):
print(bees_list[3:])
['Марья', 'Кузьминишна', 'Семённа', 'Прасковья', 'Радмила', 'Таруся', 'Антонина']
Получить все элементы массива, которые расположены после третьего, но не доходя девятого( Таруси):
print(bees_list[3:8])
['Марья', 'Кузьминишна', 'Семённа', 'Прасковья', 'Радмила']
Получить каждый нечетный элемент массива с третьего по девятый:
print(bees_list[3:8:2])
['Марья', 'Семённа', 'Радмила']
Получить каждый третий элемент всего массива:
print(bees_list[::3])
['Варвара', 'Марья', 'Прасковья', 'Антонина']
Получить каждый четный элемент всего массива:
print(bees_list[1::2])
['Степанида', 'Марья', 'Семённа', 'Радмила', 'Антонина']
И так далее.
Встроенные функции списков:
append – добавление данных.
Если нам нужно программно добавлять значения в конец массива, нам поможет функция append.
Например, давайте добавим в улей трутней. У них не будет особенных имен, но будут порядковые номера.
bees_list = [
"Варвара", "Степанида", "Фёкла", "Марья", "Кузьминишна",
"Семённа", "Прасковья", "Радмила", "Таруся", "Антонина",
]
# В цикле 10 раз
for i in range(10):
# Добавим к конец массива трутня
bees_list.append("Трутень " + str(i))
print(bees_list)
extend – расширить список другим списком (или чем-то похожим)
bees_list = [
"Варвара", "Степанида", "Фёкла", "Марья", "Кузьминишна",
"Семённа", "Прасковья", "Радмила", "Таруся", "Антонина",
]
# В цикле 10 раз
for i in range(10):
# Добавим к конец массива трутня
bees_list.append("Трутень " + str(i))
print(bees_list)
# В отдельном списке у нас хранятся пчелиные матки
queens = ['Королева Эльвира', 'Королева Брагиня']
# Совместим два списка
bees_list.extend(queens)
print(bees_list)
К списку bees_list мы добавили список queens. Впрочем, могли бы добавить что-угодно, например строку – Питон прошелся бы по каждому символу в строке и добавил бы его в конец списка.
Insert(позиция, значение) – вставить в указанную позицию
Если требуется вставить значение в определенное место списка, указываем позицию и значение, например, что бы вставить в самое начало, напишем
bees_list.insert(0, "Пасечник Геннадий")
remove – удалить элемент из массива
Этот метод удаляет первый найденный элемент из массива, который совпадает с нужным, и ругается, если не удалось. Т.е. если бы в нашем массиве было 20 Геннадиев, и мы бы вызвали
bees_list.remove(‘Геннадий’)
то удалился бы только первый, а остальные остались. Если бы Геннадиев не нашлось, выбросилось бы исключение ValueError: list.remove(x): x not in list
– сообщение о том, что выполнить команду не удалось.
pop([индекс]) – забрать элемент из массива
Когда мы вызываем этот метод, указанный элемент по индексу удаляется из массива, и значение возвращается.
Например, заберем пасечника.
bees_list = [
"Варвара", "Степанида", "Фёкла", "Марья", "Кузьминишна",
"Семённа", "Прасковья", "Радмила", "Таруся", "Антонина",
]
# В цикле 10 раз
for i in range(10):
# Добавим к конец массива трутня
bees_list.append("Трутень " + str(i))
# В отдельном списке у нас хранятся пчелиные матки
queens = ['Королева Эльвира', 'Королева Брагиня']
# Совместим два списка
bees_list.extend(queens)
bees_list.insert(0, "Пасечник Геннадий")
tsar = bees_list.pop(0)
print("Главный - ", tsar)
print(bees_list)
Если не указывать индекс, то берется последний элемент из списка
clear – целиком очищает список от значений
index(значение) – возвращает позицию элемента.
Например, если нам интересно, в какой соте сидит трутень №2, мы сделаем такой запрос:
bees_list = [
"Варвара", "Степанида", "Фёкла", "Марья", "Кузьминишна",
"Семённа", "Прасковья", "Радмила", "Таруся", "Антонина",
]
# В цикле 10 раз
for i in range(10):
# Добавим к конец массива трутня
bees_list.append("Трутень " + str(i))
# В отдельном списке у нас хранятся пчелиные матки
queens = ['Королева Эльвира', 'Королева Брагиня']
# Совместим два списка
bees_list.extend(queens)
bees_list.insert(0, "Пасечник Геннадий")
tsar = bees_list.pop(0)
print("Трутень №2 сидит в соте №", bees_list.index('Трутень 2'))
Если одинаковых значений несколько, вернется первое.
count(значение) – подсчет количества определенных одинаковых значений массива
sort – отсортировать массив
если сделать bees_list.sort() то все элементы массива выстроятся по порядку (в данном случае, по алфавиту).
Можно передать параметр bees_list.sort(reverse=True), тогда они выстроятся в обратном порядке. Тоже самое можно сделать, вызвав функцию bees_list.reverse()
Ну и конечно узнать длину списка можно с помощью функции len(список). Например len(bees_list)
Вложенность списков
В списки можно вкладывать другие списки, получая таким образом более сложные структуры. Например, мы можем создать список ульев, в каждом улье будет свой список пчел, у каждой пчелы свой набор любимых цветов.
Допустим, улья будет два, в первом две пчелы, во втором три.
hives = [ # Общий массив, в котором хранятся ульи
[ # Улей 1
[ # Любимые цветы пчелы 1
'Лютик'
],
[ # Любимые цветы пчелы 2
'Тюльпан',
'Лилия'
]
],
[ # Улей 2
[], # Любимые цветы пчелы 1
[], # Любимые цветы пчелы 2
[] # Любимые цветы пчелы 3
]
]
print("Общая инфа", hives)
print("Только улей 1", hives[0])
print("Только улей 1, пчела №2", hives[0][1])
print("Только улей 1, пчела №2, цветок №1:", hives[0][1][1])
Мы составили такую структуру, и можем обратиться к любому её элементу:
Генераторы списков
Этот раздел немного забегает вперед, но так как он имеет прямое отношение к спискам, рассмотрим его здесь.
Списки можно генерировать и/или фильтровать на лету, используя специальный синтаксис. Например, вернемся к нашим пчелам и предположим, что нам зачем-то понадобились все пчелы, у которых имя длиннее 6 символов.
Можно, конечно, пройтись в цикле по списку и оставить только нужные значения, но можно воспользоваться «синтаксическим сахаром» и выполнить такую команду:
bees_list = [
"Варвара", "Степанида", "Фёкла", "Марья", "Кузьминишна",
"Семённа", "Прасковья", "Радмила", "Таруся", "Антонина",
]
long_names_list = [name for name in bees_list if len(name) > 6]
print(long_names_list)
Это по сути более короткий код для такого синтаксиса:
long_names_list = []
for name in bees_list:
if len(name) > 6:
long_names_list.append(name)
print(long_names_list)
Результат будет тот же, но строк меньше.