Дополнительные операции со списками в Python

Материал из Викижурнал
Операции со списками в Python
Дополнительные операции со списками в Python
Дополнительные операции со списками в Python
Тематические порталы

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

Во время разработки игр, программ или приложений необходимо хранить набор чисел. Например, вам нужно будет отслеживать позиции каждого персонажа в игре, и вы можете также следить за высокими показателями игрока. При визуализации данных вы почти всегда будете работать с наборами чисел, такими как температура, расстояние, размеры населения или значения широты и долготы, среди других типов числовых данных. Списки идеально подходят для хранения наборов чисел, а Python предоставляет множество инструментов, которые помогут вам эффективно работать со списками чисел. Как только вы поймете, как эффективно использовать эти инструменты, ваш код будет хорошо работать, даже если ваши списки содержат очень много данных.

Составление числовых списков

Использование функции range ()

Функция range() в Python позволяет легко генерировать серию чисел. Например, вы можете использовать функцию range() следующим образом:

for value in range(1,5):
    print(value)

Хотя этот код выглядит так, как будто он должен вывести числа от 1 до 5, однако не выводит число 5:

1
2
3
4

В этом примере функция range() выводит только цифры от 1 до 4. Это еще один результат того, как созданы внутренние функции Python, которые часто встречаются в языках программирования. Функция range() заставляет Python начинать отсчет с первого заданного вами значения и останавливается, когда достигает второго заданного значения. Поэтому нужно иметь в виду, что вывод никогда не содержит конечного значения в этой функции. Чтобы напечатать числа от 1 до 5, нужно использовать диапазон (1,6):

for value in range(1,6):
    print(value)

На этот раз вывод диапазона включает значение 5.

1
2
3
4
5

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

Мы также можем использовать функцию range(), чтобы сообщить Python пропустить числа в заданном диапазоне. Например, вот как мы могли бы перечислить четные числа от 1 до 10:

even_numbers = list(range(2,11,2))
print(even_numbers)

В этом примере функция range() начинается со значения 2, а затем добавляется шаг - 2 к этому значению до тех пор пока не выполнятся условия в функции, то есть пока не достигнет конечного значения 11 или не пройдет его, и получим такой результат:

[2, 4, 6, 8, 10]

Можно создать практически любой набор чисел, который нужно использовать с помощью функции range(). Например, рассмотрим, как сделать список первых 10 квадратных чисел (то есть квадрата каждого целого числа от 1 до 10). В Python используются двойные звёздочки (**), чтобы возвести значения в степень. Вот так можно сделать подсчёт первых 10 квадратных чисел в списке:

squares = []
for value in range(1,11):
    square = value**2
    squares.append(square)

print(squares)

Сначала создаём пустой список squares = []. Затем мы сообщаем Python перебрать каждое значение от 1 до 10 с помощью функции range(). Внутри цикла текущее значение возводится во вторую степень и сохраняется в переменной "square". После этого каждое новое значение квадрата добавляется в список. Наконец, когда цикл завершен, выводится результаты вычислений:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Чтобы написать этот код более кратко, опустите временную переменную "square" и добавьте каждое новое значение непосредственно в список:

squares = []
for value in range(1,11):
    squares.append(value**2)

print(squares)

Код выполняет ту же работу, что и предыдущем коде. Каждое значение в цикле возводится во вторую степень, а затем сразу добавляется в список "squares".

Можно использовать любой из этих двух способов, когда создаете более сложные списки. Иногда использование временной переменной делает ваш код более легким для чтения; в других случаях это делает код излишне длинным. Сначала нужно сосредоточиться на написании кода, который вы четко понимаете, который делает то, что вы от него хотите. Затем ищите более эффективные подходы при изучении кода.

Использование функции range() для составления списка чисел

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

numbers = list(range(1,6))
print(numbers)

Получаем соответствующий результат:

[1, 2, 3, 4, 5]

Некоторые функции для работы со списком чисел

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

digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

print(min(digits))
print(max(digits))
print(sum(digits))

И получаем соответствующий вывод данных:

0
9
45

Восприятие и упрощение кода

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

squares = [value**2 for value in range(1,11)]
print(squares)

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

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Требуется практика, чтобы написать свои собственные списки, но потом поймёте, как они полезны для решения различных задач.

Работа с частью списка

В статье про списки мы узнали, как получить доступ к отдельным элементам в списке, а в этой главе вы узнали, как работать со всеми элементами в нём. Но можно также работать с определенной группой элементов в списке, который Python называет срезом.

Чтобы сделать срез, вы указываете индекс первого и последнего элементов, с которыми необходимо работать. Как и в случае с функцией range(), Python использует тот диапазон, который указывается в квадратных скобках. Например, чтобы вывести первые три элемента в списке, вы должны запросить индексы от 0 до 3-х, которые будут возвращать элементы 0, 1 и 2. Следующий пример включает список игроков в команде:

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[0:3])

Срез кода этого списка включает в себя только первые три игрока. При этом сам список сохраняет свою структуру и выводит первых трех игроков в списке:

  ['charles', 'martina', 'michael']

Можно таким же способом создать любые срезы списка. Например, если нужно получить второй, третий и четвертый элементы в списке, вы должны начать срез с индекса 1 и закончить с 4-м индексом:

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[1:4])

И соответственно мы получим следующий вывод данных из списка:

  ['martina', 'michael', 'florence']

Если пропустить первый индекс в срезе, Python автоматически будет считать срез с самого начала списка:

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[:4])

Таким образом получим вот такой результат:

['charles', 'martina', 'michael', 'florence']

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

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[2:])

Получаем соответствующий результат:

['michael', 'florence', 'eli']

Подобным сопсобом можно выводить все элементы из любой точки вашего списка и до конца, независимо от длины списка. Напомним, что отрицательный индекс выводит элемент от конца списка; следовательно. Например, если мы хотим вывести трех последних игроков из списка, мы можем использовать срез [-3:]:

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[-3:])

Такой способ выводит имена последних трех игроков и будет продолжать работать, когда список становится больше.

Копирование части списка

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

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

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

my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods[:]

print("My favorite foods are:")
print(my_foods)

print("\nMy friend's favorite foods are:")
print(friend_foods)

Сначала мы составляем список продуктов, которые нам нравятся, которые называются "my_foods". Затем мы создаем новый список под названием "friend_foods". Мы делаем копию "my_foods", запрашивая часть my_foods без указания каких-либо индексов и сохраняем копию в "friend_foods". Когда мы выводим каждый список, мы видим, что они оба содержат одинаковые продукты:

My favorite foods are:
['pizza', 'falafel', 'carrot cake']

My friend's favorite foods are:
['pizza', 'falafel', 'carrot cake']

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

my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods[:]

my_foods.append('cannoli')
friend_foods.append('ice cream')

print("My favorite foods are:")
print(my_foods)

print("\nMy friend's favorite foods are:")
print(friend_foods)

Сначала мы копируем оригинальные элементы в "my_foods" в новый список "friend_foods", как мы это делали в предыдущем примере. Затем мы добавляем новый продукт в каждый список: затем мы добавляем "cannoli" в "my_foods", а затем добавляем "ice cream" в "friend_foods". Затем мы печатаем два списка, чтобы увидеть, что добавленные элементы добавлены соответствующим образом в оба списка:

My favorite foods are:
['pizza', 'falafel', 'carrot cake', 'cannoli']

My friend's favorite foods are:
['pizza', 'falafel', 'carrot cake', 'ice cream']

Результат показывает, что "cannoli" теперь появляется в нашем списке любимых продуктов, а "ice cream" - нет. Затем видно, что «ice cream» теперь появляется в списке друзей, а «cannoli» - нет. Если бы мы просто установили friend_foods равным my_foods, мы бы не создавали два отдельных списка. Например, вот что происходит, когда вы пытаетесь скопировать список без использования фрагмента:

my_foods = ['pizza', 'falafel', 'carrot cake']
# This doesn't work:
friend_foods = my_foods

my_foods.append('cannoli')
friend_foods.append('ice cream')

print("My favorite foods are:")
print(my_foods)

print("\nMy friend's favorite foods are:")
print(friend_foods)

В этом случае вместо того, чтобы хранить копию "my_foods" в "friend_foods", мы устанавливаем "friend_foods" равным "my_foods". Этот синтаксис фактически указывает Python подключить новую переменную friend_foods к списку, который уже содержится в my_foods, поэтому теперь обе переменные указывают на один и тот же список. В результате, когда мы добавим 'cannoli' в "my_foods", он также появится в "friend_foods". Аналогично, «ice cream» появится в обоих списках, даже если оно добавлено только в "friend_foods".

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

My favorite foods are:
['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']

My friend's favorite foods are:
['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']

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

Примечание

Основная статья: Циклы со списками в Python

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

Другие статьи о Python