Список — это последовательность
Как и строка, список (list)
представляет собой последовательность значений. Значения в строке — это символы, а в списке они могут быть любого типа. Значения в списке называются элементами.
Есть несколько способов создать новый список; самый простой — заключить элементы в квадратные скобки:
[10, 20, 30, 40]
['квакающая лягушка', 'поющий жаворонок']
Первый пример — список из четырех целых чисел. Второй — список двух строк. Элементы списка не обязательно должны быть одного типа. Список ниже содержит строку, число с плавающей точкой, целое число и (внимание!) другой список:
['спам', 2.0, 5, [10, 20]]
Список внутри другого списка называется вложенным.
Список, который не содержит элементов, называется пустым. Вы можете создать такой с помощью пустых скобок []
.
Вы можете присваивать переменным значения типа список:
cheeses = ['Чеддер', 'Эдам', 'Гауда']
numbers = [12, 345]
empty = []
print(f"{cheeses} {numbers} {empty}")
['Чеддер', 'Эдам', 'Гауда'] [12, 345] []
Список — изменяемый тип данных
Синтаксис для доступа к элементам списка такой же, что и для доступа к символам строки — инструкция []
. В скобках указывается индекс. Не забудьте, что индексы начинаются с \(0\):
cheeses = ['Чеддер', 'Эдам', 'Гауда']
print(f"{cheeses[0]}")
Чеддер
В отличие от строк, списки можно изменять. Когда инструкция []
находится в левой части инструкции присваивания, она идентифицирует элемент списка, который будет назначен:
numbers = [45, 123]
numbers[1] = 5
print(f"{numbers}")
[42, 5]
Первый элемент списка numbers
, раньше был \(123\), теперь равен \(5\).
Индексы списка работают так же, как индексы строк:
● любое целочисленное выражение может быть использовано в качестве индекса;
● если вы попытаетесь прочитать или записать элемент, который не существует, вы увидите ошибку IndexError
;
● если индекс имеет отрицательное значение, он считывается в обратном направлении, начиная с конца списка.
Базовые операции
Объединение списков
a = [1, 2, 3]
b = [4, 5, 6]
c = a + b
print(f"{c}")
[1, 2, 3, 4, 5, 6]
Повторение списка
a = [0] * 4
b = [1, 2, 3] * 3
print(f"{a}")
print(f"{b}")
[0, 0, 0, 0]
[1, 2, 3, 1, 2, 3, 1, 2, 3]
Оператор in
cheeses = ['Чеддер', 'Эдам', 'Гауда']
a = 'Эдам' in cheeses
b = 'Бри' in cheeses
print(f"{a}")
print(f"{b}")
True
False
Распаковка значений списка
nums1 = [1, 2]
nums2 = [3, 4]
nums3 = [*nums1, *nums2]
print(*nums3)
1 2 3 4
Срезы списков
Оператор среза применим и к спискам:
t = ['а', 'б', 'в', 'г', 'д', 'е']
print(f"{t[1:3]}")
print(f"{t[:4]}")
print(f"{t[3:]}")
['б', 'в']
['а', 'б', 'в', 'г']
['г', 'д', 'е']
Если вы опустите первый индекс, срез начнется с нулевого элемента. Если вы опустите второй индекс, срез продолжится до конца списка. Поэтому, если вы опустите оба индекса, срез будет копией всего списка:
t = ['а', 'б', 'в', 'г', 'д', 'е']
print(f"{t[:]}")
['а', 'б', 'в', 'г', 'д', 'е']
Оператор среза в левой части операции присваивания позволяет обновлять сразу несколько элементов:
t = ['а', 'б', 'в', 'г', 'д', 'е']
t[1:3] = ['й', 'ч']
print(f"{t}")
['а', 'й', 'ч', 'г', 'д', 'е']
Обход списка
Самый распространенный способ обхода элементов списка — цикл for
.
cheeses = ['Чеддер', 'Эдам', 'Гауда']
for cheese in cheeses:
print(f"{cheese}")
Этот способ подойдет, если вам нужно только прочитать элементы списка. Но если вы хотите добавить или обновить элементы, то необходимы индексы. Распространенный способ сделать это — объединить встроенные функции range()
и len()
:
numbers = [1, 2, 3, 4, 5]
for i in range(len(numbers)):
numbers[i] *= 2
Этот цикл обходит список и обновляет каждый элемент. Функция len()
возвращает количество элементов в списке. А функция range()
возвращает список индексов от \(0\) до \(n-1\), где \(n\) — длина списка. При каждой итерации цикла переменной \(i\) присваивается индекс следующего элемента. Инструкция присваивания в теле использует переменную \(i\) для чтения старого значения элемента и присвоения нового.
Ввод и вывод списка
Для ввода данных через пробел можно использовать следующие конструкции:
a = list(map(int, input().split())) # ввод целых чисел через пробел
b = list(map(float, input().split())) # ввод вещественных чисел через пробел
с = input().split() # ввод строк через пробел
Если пользователь должен ввести \(n\) данных в столбик, то используется следующий синтаксис:
n = int(input()) # количество данных
a = [int(input()) for i in range(n)] # ввод n целых чисел в столбик
b = [float(input()) for i in range(n)] # ввод n вещественных чисел в столбик
c = [input() for i in range(n)] # ввод n строк в столбик
Для вывода элементов списка можно использовать цикл for:
numbers = [1, 2, 3, 4, 5]
for num in numbers:
print(f"{num}", end=' ')
1 2 3 4 5
или применить распаковку списка:
cheeses = ['Чеддер', 'Эдам', 'Гауда']
print(*cheeses, sep="\n")
Чеддер
Эдам
Гауда
Пример 1
Выведите \(n\) целых чисел из списка \(a\) в строку, изменив первоначальный порядок на противоположный.
n = int(input())
a = list(map(int, input().split()))
for i in range(n - 1, -1, -1):
print(f"{a[i]}", end=' ')
4
1 2 3 4
4 3 2 1
Пример 2
В списке \(a\), состоящем из \(n\) вещестенных чисел, замените последнее число на \(1.5\).
n = int(input())
a = [float(input()) for i in range(n)]
a[-1] = 1.5
print(*a)
3
-1.2
3.4
-5.6
-1.2 3.4 1.5
Пример 3
Выведите в столбик элементы списка \(a\) с номерами от \(l\) до \(r\) включительно. Нумерация элементов начинается с \(1\).
n, l, r = map(int, input().split())
a = list(map(int, input().split()))
for i in range(l - 1, r):
print(f"{a[i]}")
5 2 3
4 5 0 -7 2
5
0
Пример 4
Выведите в строку отрицательные числа списка \(a\).
n = int(input())
a = [int(input()) for i in range(n)]
for ai in a:
if ai < 0:
print(f"{ai}", end=' ')
3
-15
23
-31
-15 -31
Подсчет
Подсчёт количества – это очень частый сценарий. Он состоит из двух шагов:
- Создание переменной счётчика и придание ей первоначального значения:
k = 0
. - Увеличение переменной счётчика на \(1\):
k += 1
.
Пример 1
Посчитайте, сколько раз число \(x\) встречается в списке \(a\), состоящим из \(n\) чисел.
x = int(input())
n = int(input())
a = list(map(int, input().split()))
k = 0
for ai in a:
if ai == x:
k += 1
print(f"{k}")
1
6
1 2 3 1 2 1
3
Каждый раз, когда мы встречаем число \(x\), мы добавляем \(1\) к нашему текущему значению \(k\). В программе это реализовано в 7-й строке k += 1
. Обратите внимание на начальное значение переменной счетчика k = 0
. Без начального значения мы получили бы ошибку, поскольку дойдя до строки k += 1
Python ничего не знал бы о переменной \(k\). Строка кода k += 1
означает: возьми старое значение переменной \(k\), прибавь к нему \(1\) и переприсвой переменной это значение. Если не придать переменной начальное значение, то непонятно, к чему прибавлять \(1\) в самый первый раз.
Пример 2
Среди \(n\) чисел найдите количество чётных.
n = int(input())
a = [int(input()) for i in range(n)]
k = 0
for ai in a:
if ai % 2 == 0:
k += 1
print(f"{k}")
5
6
1
0
13
-8
3
Суммирование
Подсчёт суммы состоит из двух шагов:
- Создание переменной сумматора и придание ей первоначального значения:
s = 0
. - Увеличение переменноё сумматора на нужно число:
s += x
.
Пример 1
Среди \(n\) целых чисел найдите сумму однозначных.
n = int(input())
a = [int(input()) for i in range(n)]
s = 0
for ai in a:
if -9 <= ai <= 9:
s += ai
print(f"{s}")
3
4
-100
-2
2
Пример 2
Вычислите сумму вещественных чисел с чётными индексами. Индексация начинается с \(0.\)
n = int(input())
a = list(map(float, input().split()))
s = 0
for i in range(0, n, 2):
s += a[i]
print(f"{s}")
5
0.1 2.3 4.5 6.7 8.9
13.5
Максимум и минимум
Поиск наибольшего или наименьшего значения в некоторой последовательности чисел, также частая задача в программировании.
Пример 1
Выведите минимальное число в списке \(a\), состоящим из \(n\) чисел.
n = int(input())
a = list(map(int, input().split()))
mn = float('inf')
for ai in a:
if ai < mn:
mn = ai
print(f"{mn}")
5
3 5 1 4 2
1
Мы устанавливаем начальное значение переменной \(mn\) в \(\infty\) (бесконечно большое число). Далее мы идем по списку чисел, и если какое-то из них оказывается меньше текущего значения \(mn\), то мы переприсваиваем его. В качестве начального значения взято число \(\infty\), чтобы уже первое сравнение привело к переприсваиванию.
Пример 2
Выведите номер максимального числа в списке \(a\), состоящим из \(n\) чисел. Если таких чисел несколько, то выведите номер последнего. Нумерация начинается с \(1\).
n = int(input())
a = list(map(int, input().split()))
mx = a[0]
idx = 1
for i in range(n):
if a[i] >= mx:
mx = a[i]
idx = i + 1
print(f"{idx}")
6
1 2 3 3 2 1
4
Распространен подход, когда в качестве начального значения переменной, сразу принимается первый элемент последовательности: mx = a[0]
.
Пример 3
В списке \(a\), состоящим из \(n\) различных чисел, обменяйте минимальный и максимальный элементы местами.
n = int(input())
a = list(map(int, input().split()))
mn = a[0]
mn_idx = 0
mx = a[0]
mx_idx = 0
for i in range(n):
if a[i] > mx:
mx = a[i]
mx_idx = i
if a[i] < mn:
mn = a[i]
mn_idx = i
a[mn_idx], a[mx_idx] = a[mx_idx], a[mn_idx]
print(*a)
3
1 2 3
3 2 1
Пример 4
В первой строке выведите минимальное число в списке \(a\), состоящим из \(n\) чисел. Во второй строке выведите номера всех минимальных элементов. Нумерация начинается с \(1\).
n = int(input())
a = list(map(int, input().split()))
mn = float('inf')
for ai in a:
if ai < mn:
mn = ai
print(f"{mn}")
for i in range(n):
if a[i] == mn:
print(f"{i + 1}", end=' ')
7
1 2 1 3 5 4 1
1
1 3 7
Поиск
Для поиска элемента в спике можно использовать сигнальную метку (флажок). Флажок нужен для того, чтобы одна часть программы узнала, о происходящем в другой части программы.
Пример 1
Определите, является ли каждое из \(n\) чисел однозначным или нет.
n = int(input())
a = [int(input()) for i in range(n)]
flag = True
for ai in a:
if not -9 <= ai <= -9:
flag = False
break
if flag:
print(f"YES")
else:
print(f"NO")
3
5
-1
0
YES
2
8
-11
NO
Программа работает следующим образом: начальное значение переменной флага равно True
, что говорит о том, что числа являются однозначными. Затем мы перебираем \(n\) чисел. Если одно из этих чисел оказывается не однозначным, тогда мы устанавливаем значение флага False
. Как только цикл завершен, мы проверяем, установлен флаг или нет. Если это так, то все числа являются однозначными. В противном случае мы встретили число, которое не является однозначным.
Пример 2
Определите, есть ли в списке \(a\), состоящим из \(n\) слов, слово python. Если есть, то выведите его номер. Если таких несколько, то выведите минимальный номер. Если слова python нет в списке, то выведите \(-1.\)
n = int(input())
a = input().split()
ans = -1
for i in range(n):
if a[i] == 'python':
ans = i + 1
break
print(f"{ans}")
5
pascal python java c++ python
2
3
go php javascript
-1