8.Работа со списками

Базовые приёмы

Чтобы создать список, нужно перечислить его элементы через запятую в квадратных скобках: numbers = [2, 4, 64, 17, 10]
languages = ['Python', 'C++', 'Java']

Индексация в списках похожа на индексацию в строках. В списках индексу соответствует какое-то значение списка.

Список numbers состоит из 5 элементов, и каждый из них — целое число:

  • numbers[0] == 2;
  • numbers[1] == 4;
  • numbers[2] == 64;
  • numbers[3] == 17;
  • numbers[4] == 10.

Список languages состоит из 4 элементов, каждый из которых — строка:

  • languages[0] == 'Python';
  • languages[1] == 'C++';
  • languages[2] == 'Java'.

Значения, заключенные в квадратные скобки и отделенные запятыми, называются элементами списка. Список может содержать значения разных типов данных: info = ['Timur', 1992, 61.5]

Для вывода всего списка можно применить функцию print. Функция print() выводит на экран элементы списка, в квадратных скобках, разделенные запятыми: numbers = [2, 4, 6, 8, 10]
languages = ['Python', 'C++', 'Java']
print(numbers) # [2, 4, 6, 8, 10]
print(languages) # ['Python', 'C#', 'C++']

Операторы + и * можно использовать для списков. Оператор + соединяет все списки в один. Оператор * создаёт список с указанным количеством одних и тех же элементов: print(['a', 'b'] + [1, 4]) # ['a', 'b', 1, 4]
print(['a', 'b'] * 3) # ['a', 'b', 'a', 'b', 'a', 'b']

Мы можем найти длину списку с помощью функции len: a = ['a', 'b', 'c', '1', '2', '3']
print(len(a)) # 6

С помощью оператора in, мы можем проверять, находится ли какое-то значение в списке: foods = ['хлеб', 'молоко', 'печенье']
if 'молоко' in s:
print("Нужно купить молоко")
else:
print("Молоко покупать не надо")

Python имеет встроенную функцию list(), которая помимо создания пустого списка может преобразовывать некоторые типы объектов в списки. Например, мы знаем, что функция range() создает последовательность целых чисел в заданном диапазоне. Для преобразования этой последовательности в список, мы пишем следующий код: numbers = list(range(5))

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

  1. Вызывается функция range(), в которую в качестве аргумента передается число 5;
  2. Эта функция возвращает последовательность чисел 0, 1, 2, 3, 4;
  3. Последовательность чисел 0, 1, 2, 3, 4 передается в качестве аргумента в функцию list();
  4. Функция list() возвращает список [0, 1, 2, 3, 4];
  5. Список [0, 1, 2, 3, 4] присваивается переменной numbers.

Точно так же с помощью функции list() мы можем создать список из символов строки. Для преобразования строки в список мы пишем следующий код: s = 'abcde'
chars = list(s)
print(chars) # ['a', 'b', 'c', 'd', 'e']

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

С помощью среза мы можем получить несколько элементов списка, создав диапазон индексов, разделенных двоеточием: numbers = [2, 4, 6, 8, 10]
print(numbers[1:3]) # [4, 6]
print(numbers[2:5]) # [6, 8, 10]

При построении среза первое число – это то место, где начинается срез (включительно), а второе – это место, где заканчивается срез (невключительно). Разрезая списки, мы создаем новые списки, по сути, подсписки исходного.

При использовании срезов со списками мы также можем опускать второй параметр в срезе numbers[x:] (но поставить двоеточие), тогда срез берется до конца списка. Аналогично если опустить первый параметр numbers[:y], то можно взять срез от начала списка. Срез numbers[:] возвращает копию исходного списка: numbers = [2, 4, 6, 8, 10, 12, 14]
print(numbers[4:]) # [10, 12, 14]
print(numbers[:5]) # [2, 4, 6, 8, 10]

Как и в строках, мы можем использовать отрицательные индексы в срезах списков.

Для изменения целого диапазона элементов списка можно использовать срезы. Например, если мы хотим перевести на русский язык названия фруктов 'banana', 'cherry', 'kiwi', то это можно сделать с помощью среза. fruits = ['apple', 'apricot', 'banana', 'cherry', 'kiwi', 'lemon']
fruits[2:5] = ['банан', 'вишня', 'киви']

print(fruits) # ['apple', 'apricot', 'банан', 'вишня', 'киви', 'lemon']

Также мы можем удалять элемент списка по индексу или подсписок с помощью среза через оператор del: numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]

del numbers[5]
print(numbers) # [1, 2, 3, 4, 5, 7, 8, 9]

del numbers[2:6]
print(numbers) # [1, 2, 8, 9]

Мы можем удалить все элементы на четных позициях (0, 2, 4, ...) исходного списка. numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
del numbers[::2]

print(numbers) # [2, 4, 6, 8]

Встроеные функции

Встроенная функция sum() принимает в качестве аргумента список чисел и вычисляет сумму его элементов: numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print('Сумма всех элементов списка =', sum(numbers)) # 'Сумма всех элементов списка = 45'

Встроенные функции min() и max() принимают в качестве аргумента список и находят минимальный и максимальный элементы соответственно: numbers = [3, 4, 10, 3333, 12, -7, -5, 4]
print('Минимальный элемент =', min(numbers)) # 'Минимальный элемент = -7'
print('Минимальный элемент =', max(numbers)) # 'Максимальный элемент = 3333'

Встроенная функция sorted() принимает в качестве аргумента список и возвращает отсортированный, также может принять аргумент reverse, если он равен False (по умолчанию), то сортирует по возрастанию если равен True, то по убыванию a = [1, 7, -3, 9, 0, -67, 34, 12, 45, 1000, 6, 8, -2, 99]
sort1_a = sorted(a)
print(sort1_a) # [-67, -3, -2, 0, 1, 6, 7, 8, 9, 12, 34, 45, 99, 1000]

sort1_a = sorted(a, reverse=True)
print(sort1_a) # [1000, 99, 45, 34, 12, 9, 8, 7, 6, 1, 0, -2, -3, -67]

Методы списков

l.append(m) - добавляет в список l элемент m: numbers = [1, 1, 2, 3, 5, 8, 13, 4]

numbers.append(21)
numbers.append(34)

print(numbers) # [1, 1, 2, 3, 5, 8, 13, 21, 34]

l.count(m) - выводит количество элементов m в списке l: names = ['Timur', 'Gvido', 'Roman', 'Timur', 'Anders', 'Timur']

cnt1 = names.count('Timur')
cnt2 = names.count('Josef')
print(cnt1) # 3
print(cnt2) # 0

l.index(m) - выводит индекс первого вхождения элемента m в списке l, если нет элемента m в списке, то происходит ошибка: names = ['Gvido', 'Roman', 'Timur', 'Anders', 'Timur']

position = names.index('Timur')
print(position) # 2
names = ['Gvido', 'Roman', 'Timur']

position = names.index('Anders')
print(position) # ValueError: 'Anders' is not in list

l.remove(m) - удаляет первый элемент m в списке l, если нет элемента m в списке, то происходит ошибка: food = ['Рис', 'Курица', 'Рыба', 'Брокколи', 'Рис']
print(food) # ['Рис', 'Курица', 'Рыба', 'Брокколи', 'Рис']
food.remove('Рис')
print(food) # ['Курица', 'Рыба', 'Брокколи', 'Рис']

l.sort(reverse) - сортирует список по возрастанию, если reverse=False, а если reverse=True, то по убыванию, по умолчанию: reverse=False: a = [1, 7, -3, 9, 0, -67, 34, 12, 45, 1000, 6, 8, -2, 99]
a.sort()
print('Отсортированный список:', a)
# Отсортированный список: [-67, -3, -2, 0, 1, 6, 7, 8, 9, 12, 34, 45, 99, 1000]

a.sort(reverse=True)
print('Отсортированный список:', a)
# Отсортированный список: [1000, 99, 45, 34, 12, 9, 8, 7, 6, 1, 0, -2, -3, -67]
Отличие от функции sorted в том, что sorted возвращает отсортированный список, но не изменяет его, а sort - изменяет сам список, но ничего не возвращает. a = [1, 7, -3, 9, 0, -67, 34, 12, 45, 1000, 6, 8, -2, 99]

print(sorted(a)) # [-67, -3, -2, 0, 1, 6, 7, 8, 9, 12, 34, 45, 99, 1000]
print(a.sort())) # None

Также мы можем вывести все значения списка без квадратных скобок [], для этого в функции print необходимо перед именем переменной со списком поставить знак звёздочки *: l = [1, 5, "st", 1.043, "And"]
print(*l) # 1 5 st 1.043 And