Part 4

Списки

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

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

Следующая команда создает новый пустой список

my_list = []

а эта команда создает список с пятью элементами:

my_list = [7, 2, 2, 5, 2]

Обращение к элементам списка

Элементы списка индексируются точно так же, как символы в строке. Индексация начинается с нуля, а последний индекс равен длине списка минус 1:

Lists are indexed starting from 0

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

my_list = [7, 2, 2, 5, 2]

print(my_list[0])
print(my_list[1])
print(my_list[3])

print("The sum of the first two items:", my_list[0] + my_list[1])
Пример вывода

7 2 5 The sum of the first two items: 9

Можно также вывести все содержимое списка:

my_list = [7, 2, 2, 5, 2]
print(my_list)
Пример вывода

[7, 2, 2, 5, 2]

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

my_list = [7, 2, 2, 5, 2]
print(my_list)
my_list[1] = 3
print(my_list)
Пример вывода

[7, 2, 2, 5, 2] [7, 3, 2, 5, 2]

Функция len дает количество элементов в списке:

my_list = [7, 2, 2, 5, 2]
print(len(my_list))
Пример вывода

5

Loading

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

Метод append добавляет элементы в конец списка. Он работает так:

numbers = []
numbers.append(5)
numbers.append(10)
numbers.append(3)
print(numbers)
Пример вывода

[5, 10, 3]

В следующем примере используются два отдельных списка:

numbers = []
shoe_sizes = []

numbers.append(5)
numbers.append(10)
numbers.append(3)

shoe_sizes.append(37)
shoe_sizes.append(44)
shoe_sizes.append(40)
shoe_sizes.append(28)

print("Numbers:")
print(numbers)

print("Shoe sizes:")
print(shoe_sizes)

Элемент добавляется в тот список, для которого вызывается метод:

Пример вывода

Numbers: [5, 10, 3] Shoe sizes: [37, 44, 40, 28]

Loading

Добавление в определенное место

Если вы хотите указать место в списке, куда должен быть добавлен элемент, можно использовать метод insert. Метод добавляет элемент по указанному индексу. Все элементы, которые уже находятся в списке и имеют индекс, равный указанному или больше него, сдвигаются на один индекс дальше, "вправо":

Inserting an item to a list

Итак, например, эта программа

numbers = [1, 2, 3, 4, 5, 6]
numbers.insert(0, 10)
print(numbers)
numbers.insert(2, 20)
print(numbers)

выводит:

Пример вывода

[10, 1, 2, 3, 4, 5, 6] [10, 1, 20, 2, 3, 4, 5, 6]

Удаление элементов из списка

Есть два разных подхода к удалению элемента из списка:

  • Если известен индекс элемента, можно использовать метод pop.
  • Если известно содержимое элемента, можно использовать метод remove.

Итак, метод pop принимает индекс элемента, который нужно удалить, как аргумент. Следующая программа удаляет из списка элементы с индексами 2 и 3. Обратите внимание, как индексы оставшихся элементов меняются после удаления одного элемента.

my_list = [1, 2, 3, 4, 5, 6]

my_list.pop(2)
print(my_list)
my_list.pop(3)
print(my_list)
Пример вывода

[1, 2, 4, 5, 6] [1, 2, 4, 6]

Полезно помнить, что метод pop также возвращает удаленный элемент:

my_list = [4, 2, 7, 2, 5]

number = my_list.pop(2)
print(number)
print(my_list)
Пример вывода

7 [4, 2, 2, 5]

Метод remove, с другой стороны, принимает значение удаляемого элемента как аргумент. Например, эта программа

my_list = [1, 2, 3, 4, 5, 6]

my_list.remove(2)
print(my_list)
my_list.remove(5)
print(my_list)

выводит:

Пример вывода

[1, 3, 4, 5, 6] [1, 3, 4, 6]

Метод удаляет первое появление значения в списке, примерно так же, как строковая функция find возвращает первое появление подстроки:

my_list = [1, 2, 1, 2]

my_list.remove(1)
print(my_list)
my_list.remove(1)
print(my_list)
Пример вывода

[2, 1, 2] [2, 2]

Loading

Если указанного элемента нет в списке, функция remove вызывает ошибку. Как и со строками, мы можем проверить наличие элемента с помощью оператора in:

my_list = [1, 3, 4]

if 1 in my_list:
    print("The list contains item 1")

if 2 in my_list:
    print("The list contains item 2")
Пример вывода

The list contains item 1

Loading

Сортировка списков

Элементы списка можно отсортировать от меньшего к большему с помощью метода sort.

my_list = [2,5,1,2,4]
my_list.sort()
print(my_list)
Пример вывода

[1, 2, 2, 4, 5]

Обратите внимание, что метод изменяет сам список. Иногда мы не хотим менять исходный список, поэтому вместо этого используем функцию sorted. Она возвращает отсортированный список:

my_list = [2,5,1,2,4]
print(sorted(my_list)))
Пример вывода

[1, 2, 2, 4, 5]

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

original = [2, 5, 1, 2, 4]
in_order = sorted(original)
print(original)
print(in_order)
Пример вывода

[2, 5, 1, 2, 4] [1, 2, 2, 4, 5]

Loading

Максимум, минимум и сумма

Функции max и min, сокращения от maximum и minimum, возвращают соответственно наибольший и наименьший элемент списка. Функция sum возвращает сумму всех элементов списка.

my_list = [5, 2, 3, 1, 4]

greatest = max(my_list)
smallest = min(my_list)
list_sum = sum(my_list)

print("Smallest:", smallest)
print("Greatest:", greatest)
print("Sum:", list_sum)
Пример вывода

Smallest: 1 Greatest: 5 Sum: 15

Методы и функции

В Python есть два разных способа обрабатывать списки, и это может запутать. В основном вы будете использовать методы списков, такие как append и sort. Они используются с оператором точки . на переменной списка:

my_list = []

# method calls
my_list.append(3)
my_list.append(1)
my_list.append(7)
my_list.append(2)

# another method call
my_list.sort()

Некоторые функции охотно принимают список как аргумент. Выше мы видели, что функции max, min, len и sorted именно так и работают:

my_list = [3, 2, 7, 1]

# function calls take the list as an argument
greatest = max(my_list)
smallest = min(my_list)
length = len(my_list)

print("Smallest:", smallest)
print("Greatest:", greatest)
print("Length of the list:", length)

# another function call 
# the list itself is an argument, the function returns a sorted copy
in_order = sorted(my_list)
print(in_order)
Пример вывода

Smallest: 1 Greatest: 7 Length of the list: 4 [1, 2, 3, 7]

Список как аргумент или возвращаемое значение

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

def median(my_list: list):
    ordered = sorted(my_list)
    list_centre = len(ordered) // 2
    return ordered[list_centre]

Функция создает упорядоченную версию списка, переданного как аргумент, и возвращает элемент в самой середине. Обратите внимание на оператор целочисленного деления //, использованный здесь. Индекс списка всегда должен быть целым числом.

Функция работает так:

shoe_sizes = [45, 44, 36, 39, 40]
print("The median of the shoe sizes is", median(shoe_sizes))

ages = [1, 56, 34, 22, 5, 77, 5]
print("The median of the ages is", median(ages))
Пример вывода

The median of the shoe sizes is 40 The median of the ages is 22

Функция также может возвращать список. Следующая функция просит пользователя вводить целые числа и возвращает ввод как список:

def input_numbers():
    numbers = []
    while True:
        user_input = input("Please type in an integer, leave empty to exit: ")
        if len(user_input) == 0:
            break
        numbers.append(int(user_input))
    return numbers

Функция использует вспомогательную переменную numbers, которая является списком. Все числа, введенные пользователем, добавляются в список. Когда из цикла выходят, функция возвращает список с помощью инструкции return numbers.

Вызов функции вот так

numbers = input_numbers()

print("The greatest number is", max(numbers))
print("The median of the numbers is", median(numbers))

мог бы вывести, например:

Пример вывода

Please type in an integer, leave empty to exit: 5 Please type in an integer, leave empty to exit: -22 Please type in an integer, leave empty to exit: 4 Please type in an integer, leave empty to exit: 35 Please type in an integer, leave empty to exit: 1 Please type in an integer, leave empty to exit: The greatest number is 35 The median of the numbers is 4

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

Конечно, того же поведения можно было бы добиться и без написания собственных функций:

numbers = []
while True:
    user_input = input("Please type in an integer, leave empty to exit: ")
    if len(user_input) == 0:
        break
    numbers.append(int(user_input))

ordered = sorted(numbers)
list_centre = len(ordered) // 2
median = ordered[list_centre]

print("The greatest number is", max(numbers))
print("The median of the numbers is", median)

В этой версии следить за логикой программы сложнее, потому что уже не ясно, какие команды относятся к какой функциональности. Код выполняет те же задачи — читает ввод, вычисляет медианное значение и так далее, — но его структура менее ясна.

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

Еще одно важное применение функций — делать код повторно используемым. Если вам нужно выполнить какую-то функциональность несколько раз в программе, хорошая идея — создать собственную функцию и дать ей подходящее имя:

print("Shoe sizes:")
shoe_sizes = input_numbers()

print("Weights:")
weights = input_numbers()

print("Heights:")
heights = input_numbers()
Loading
Loading
Loading

Есть еще много способов использовать списки в Python. Документация Python — хорошее место, чтобы начать, если вы хотите узнать больше.

Вы дошли до конца этого раздела! Перейти к следующему разделу:

Текущие баллы можно посмотреть в синем индикаторе в правом нижнем углу страницы.