Список — это последовательность

Как и строка, список (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

Практические задания

Подсчет

Подсчёт количества – это очень частый сценарий. Он состоит из двух шагов:

 

  1. Создание переменной счётчика и придание ей первоначального значения: k = 0.
  2. Увеличение переменной счётчика на \(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

Практические задания

Суммирование

Подсчёт суммы состоит из двух шагов:

 

  1. Создание переменной сумматора и придание ей первоначального значения: s = 0.
  2. Увеличение переменноё сумматора на нужно число: 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

Практические задания