Перейти к содержанию

Знакомство со списками

Мы уже знаем тип данных, который называется множество и является коллекцией (контейнером), то есть позволяет хранить несколько элементов данных, и тип, который тоже обладает свойствами коллекции и называется строка. Сегодня мы познакомимся с еще одним типом-коллекцией, который называется список (list). Никогда не создавайте переменные с таким именем!

Имеет смысл еще раз задать вопрос учащимся, что будет, если все-таки создать переменную с именем list (повторение — мать учения 😁). И при необходимости пояснить, что в этом случае функция list нам больше не будет доступна, т. к. мы заменили ее своей переменной.

Списки являются очень гибкой структурой данных и широко используются в программах. Давайте рассмотрим основные свойства списка в сравнении с теми коллекциями, которые мы уже знаем:

  • Список хранит несколько элементов под одним именем (как и множество)
  • Элементы списка могут повторяться (в отличие от множества)
  • Элементы списка упорядочены и проиндексированы, доступна операция среза (как в строке)
  • Элементы списка можно изменять (в отличие от строки)
  • Элементами списка могут быть значения любого типа: целые и действительные числа, строки и даже другие списки

Списки

Создание списка

Чтобы работать со списком, нужно его создать. Для этого используется операция присваивания. Чтобы задать готовый список, нужно справа от знака присваивания в квадратных скобках перечислить его элементы через запятую. Здесь создается список из первых пяти простых чисел, который помещается в переменную primes («простые числа»):

primes = [2, 3, 5, 7, 11]
print(primes)  # выводим на экран список целиком

Для того чтобы создать пустой список, можно воспользоваться конструкцией [] или функцией list.

empt1 = [] # это пустой список
empt2 = list()  # и это тоже пустой список

Теперь вспомним один из рассмотренных нами ранее способов создания cтроки из заданного количества повторяющихся подстрок. Такую строку можно легко составить путем умножения на число:

1
2
3
4
print("'$' * 5 -->", '$' * 5)
# '$' * 5 --> $$$$$
print("'-|' * 4 + '-' -->", '-|' * 4 + '-')
# '-|' * 4 + '-' --> -|-|-|-|-

Аналогично поступают и со списками:

print([2, 3] * 4)
# [2, 3, 2, 3, 2, 3, 2, 3]

Для генерации списков и строк, состоящих строго из повторяющихся элементов (например, список из заданного количества нулей), умножение на число — самый короткий и красивый метод.

my_list = [0] * 4

Индексация в списках

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

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

print('Сумма первых двух простых чисел:', primes[0] + primes[1])
print('Последнее из простых чисел в нашем списке:', primes[-1])

Как и в строках, попытка обратиться к элементу с несуществующим индексом вызовет ошибку:

print(primes[5]) # ошибка: index out of range
1
2
3
print('Сумма первых двух простых чисел:', primes[0] + primes[1])
print('Последнее из простых чисел в нашем списке:', primes[-1])
print(primes[5])  # ошибка: выход за пределы

Добавление элементов

Добавление элемента в конец списка делается при помощи метода append (этот метод аналогичен методу add, используемому для добавления элементов в множество):

primes.append(13)
primes.append(15)  # ой, ошиблись — 15 составное число!

Обратите внимание: для того чтобы воспользоваться методом append, нужно, чтобы список был создан (при этом он может быть пустым).

Попытка применить метод append к несуществующему списку приведет к ошибке. Заметьте: два вызова метода append в следующем примере добавляют элемент к двум разным спискам.

1
2
3
odd_numbers = [1, 3, 5, 7, 9, 11, 13, 15, 17]
primes.append(19)
odd_numbers.append(19)

Расширение списка

Кроме того, вы можете расширить имеющийся список любым итерабельным (перечисляемым) объектом с помощью метода extend:

1
2
3
4
my_list = [1, 2, 3]
another_list = [4, 5, 6]
my_list.extend(another_list)
print(my_list)  # [1, 2, 3, 4, 5, 6]

Расширение списка строкой

Имейте в виду, что строка является итерируемой, поэтому, если вы расширите список строкой, вы добавите каждый символ, когда будете перебирать строку (что может быть не так, как вы хотите):

1
2
3
4
my_list = [1, 2, 3]
another_list = "привет"
my_list.extend(another_list)
print(my_list) # [1, 2, 3, 'п', 'р', 'и', 'в', 'е', 'т']

Расширение списка множеством

Множество также является итерируемым типом, поэтому если расширить список множеством, то элементы множества добавятся в конец списка, но в произвольном порядке:

1
2
3
4
my_list = [1, 2, 3]
another_set = {'п', 'р', 'и', 'в', 'е', 'т'}
my_list.extend(another_set)
print(my_list) # [1, 2, 3, 'в', 'и', 'р', 'т', 'е', 'п']

Изменение элемента списка

В отличие от отдельных символов в строках, элемент списка можно поместить слева от = в операторе присваивания и тем самым изменить этот элемент:

1
2
3
primes[6] = 17  # Исправляем ошибку:
#  седьмое (нумерация элементов списка - с нуля!)
#  простое число - не 15, а 17.

Тем не менее многие вещи, которые можно делать со строками, можно делать и со списками:

1
2
3
4
5
6
7
8
print(len(primes))  # выводим длину списка
primes += [23, 29]  # списки можно складывать, как и строки
print(primes)  # выведет [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
if 1 in primes:  # можно проверять, содержится ли в списке элемент
    print('Мы считаем единицу простым числом.')
else:
    print('Мы, как и всё остальное человечество, не считаем 1 '
        + 'простым числом.')

Перебор элементов списка

Во время выполнения программы текущее количество элементов списка всегда известно. Поэтому, если нужно что-то сделать с каждым элементом списка (например, напечатать его на экране), можно перебрать элементы с помощью цикла for. При этом, как и для строк, возможны два варианта перебора — перебор индексов и перебор самих элементов.

1
2
3
4
5
for i in range(len(primes)):
    # выведем по очереди все элементы списка...
    print('Простое число номер', i + 1, '-', primes[i])
for p in primes:
    print('Квадрат числа', p, '-', p ** 2)  # и их квадраты

Заметьте, что при использовании конструкции for i in range(len(имя_списка)) индексы перебираются в цикле очень удобно: от 0 включительно до длины списка не включительно. Таким образом, можно перебрать все элементы списка.

Цикл for нередко используется и для формирования списка, если мы заранее знаем, сколько элементов в нем должно быть:

1
2
3
4
5
6
n = 10
a = []
print('Введите', n, 'значений:')
for i in range(n):
    a.append(input())
print('Получился список строк:', a)

Срезы списков

Как и для строк, для списков определена операция взятия среза:

1
2
3
4
5
6
7
8
9
months = [
    'январь', 'февраль', 'март',
    'апрель', 'май', 'июнь', 'июль',
    'август', 'сентябрь', 'октябрь',
    'ноябрь', 'декабрь'
]
spring = months[2:5]  # spring == ['март', 'апрель', 'май']
for month in spring:
    print(month)

Использование срезов

Срезы можно использовать и для присваивания новых значений элементам списка. Например, если мы решим перевести на английский названия летних месяцев, это можно сделать с помощью среза:

1
2
3
...
months[5:8] = ['June', 'July', 'August']
...

Теперь список months будет выглядеть так:

1
2
3
4
5
6
[
    'январь', 'февраль', 'март',
    'апрель', 'май', 'June', 'July',
    'August', 'сентябрь', 'октябрь',
    'ноябрь', 'декабрь'
]

Удаление элементов

С помощью функции del можно удалять элементы списка.

1
2
3
a = [1, 2, 3, 4, 5, 6]
del a[2]
print(a)  # [1, 2, 4, 5, 6]

Элемент под указанным индексом удаляется, а список перестраивается.

Функция del работает и со срезами: например, так можно удалить все элементы на четных позициях исходного списка:

1
2
3
a = [1, 2, 3, 4, 5, 6]
del a[::2]
print(a)  # [2, 4, 6]

Списки и массивы

Во многих языках программирования (да и в самом Python, в недрах стандартной библиотеки) имеется другой тип данных с похожими свойствами — массив. В отличие от списка, все элементы массива имеют одинаковый тип и занимают одинаковое количество памяти. Списки в Python — более гибкая структура: они могут хранить элементы разных типов и динамически менять размер. Поэтому слова «список» и «массив» в контексте Python часто употребляются как синонимы, хотя строго говоря это не одно и то же.


Задачи

Задача 1

Считайте n строк и выведите их в том же порядке через пробел.

Тест 1:

Ввод:

4
картину
корзину
картонку
собачонку
Вывод:
картину корзину картонку собачонку


Задача 2

Считайте n строк, затем поисковый запрос. Выведите все строки, содержащие этот запрос.

Тест 1:

Ввод:

4
учебник питона
кот на крыше
упражнения по питону
мыши и питоны
питон
Вывод:
учебник питона
упражнения по питону
мыши и питоны


Задача 3

Считайте n строк и найдите попарные суммы соседних элементов. Выведите через пробел.

Тест 1:

Ввод:

4
2
7
10
5
Вывод:
9 17 15


Задача 4

Считайте n строк и выведите их в обратном порядке.

Тест 1:

Ввод:

3
раз
два
три
Вывод:
три
два
раз


Задача 5

Считайте n чисел и выведите их утроенные значения через пробел.

Тест 1:

Ввод:

3
25
10
12
Вывод:
75 30 36


Задача 6

Считайте n строк и 2 числа p и q (индексы, нумерация с 0). Выведите сумму чисел из списка в диапазоне от p до q включительно.

Тест 1:

Ввод:

5
100
200
300
400
500
1
3
Вывод:
900


Задача 7

Считайте n строк и 2 поисковых слова. Выведите строки, содержащие оба слова.

Тест 1:

Ввод:

4
учебник питона
кормовые мыши для питонов
коты и мыши
просто питон
питон
мыши
Вывод:
кормовые мыши для питонов


Задача 8

Расписание супов на n дней. Супы чередуются в цикле: щи, борщ, щавелевый, овсяный, по-чабански. Выведите суп для каждого дня.

Тест 1:

Ввод:

8
Вывод:
щи
борщ
щавелевый
овсяный
по-чабански
щи
борщ
щавелевый


Задача 9

Считайте список строк из "белого списка" (до пустой строки), затем список запросов (до пустой строки). Выведите только те запросы, которые есть в белом списке.

Тест 1:

Ввод:

учебники
котики
почта
[пустая строка]
котики
вирусы
учебники
[пустая строка]
Вывод:
котики
учебники


Задача 10

Считайте n строк — каждая состоит из позиции (число) и буквы через пробел. Соберите из букв слово в порядке указанных позиций (нумерация с 1). Выведите полученное слово.

Тест 1:

Ввод:

5
3 т
1 п
4 о
2 и
5 н
Вывод:
питон