Списки в Python
Часть 2
Всем привет! В этой статье мы познакомимся с методами для работы со списками в python
. Но сначала вспомним, что такое список? Список - это изменяемый и последовательный тип данных. Это значит, что мы можем добавлять, удалять и изменять любые элементы списка.
Начнем с метода append()
, который добавляет элемент в конец списка:
# Создаем список, состоящий из четных чисел от 0 до 8 включительно
numbers = list(range(0,10,2))
# Добавляем число 200 в конец списка
numbers.append(200)
print(numbers)
# [0, 2, 4, 6, 8, 200]
numbers.append(1)
numbers.append(2)
numbers.append(3)
print(numbers)
# [0, 2, 4, 6, 8, 200, 1, 2, 3]
Мы можем передавать методу append()
абсолютно любые значения:
all_types = [10, 3.14, 'Python', ['I', 'am', 'list']]
all_types.append(1024)
all_types.append('Hello world!')
all_types.append([1, 2, 3])
print(all_types)
# [10, 3.14, 'Python', ['I', 'am', 'list'], 1024, 'Hello world!', [1, 2, 3]]
Метод append()
отлично выполняет свою функцию. Но, что делать, если нам нужно добавить элемент в середину списка? Это умеет метод insert()
. Он добавляет элемент в список на произвольную позицию. insert()
принимает в качестве первого аргумента позицию, на которую нужно вставить элемент, а вторым — сам элемент.
# Создадим список чисел от 0 до 9
numbers = list(range(10))
# Добавление элемента 999 на позицию с индексом 0
numbers.insert(0, 999)
print(numbers)
# [999, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
numbers.insert(2, 1024)
print(numbers)
# [999, 0, 1024, 1, 2, 3, 4, 5, 6, 7, 8, 9]
numbers.insert(5, 'Засланная строка-шпион')
print(numbers)
# [999, 0, 1024, 1, 2, 'Засланная строка-шпион', 3, 4, 5, 6, 7, 8, 9]
Отлично! Добавлять элементы в список мы научились, осталось понять, как их из него удалять. Метод pop()
удаляет элемент из списка по его индексу:
numbers = list(range(10))
print(numbers)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# Удаляем первый элемент
numbers.pop(0)
print(numbers)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
numbers.pop(0)
print(numbers)
# [2, 3, 4, 5, 6, 7, 8, 9]
numbers.pop(2)
print(numbers)
# [2, 3, 5, 6, 7, 8, 9]
# Чтобы удалить последний элемент, вызовем метод pop без аргументов
numbers.pop()
print(numbers)
# [2, 3, 5, 6, 7, 8]
numbers.pop()
print(numbers)
# [2, 3, 5, 6, 7]
Теперь мы знаем, как удалять элемент из списка по его индексу. Но что, если мы не знаем индекса элемента, но знаем его значение? Для такого случая у нас есть метод remove()
, который удаляет первый найденный по значению элемент в списке.
all_types = [10, 'Python', 10, 3.14, 'Python', ['I', 'am', 'list']]
all_types.remove(3.14)
print(all_types)
# [10, 'Python', 10, 'Python', ['I', 'am', 'list']]
all_types.remove(10)
print(all_types)
# ['Python', 10, 'Python', ['I', 'am', 'list']]
all_types.remove('Python')
print(all_types)
# [10, 'Python', ['I', 'am', 'list']]
А сейчас немного посчитаем, посчитаем элементы списка с помощью метода count()
numbers = [100, 100, 100, 200, 200, 500, 500, 500, 500, 500, 999]
print(numbers.count(100))
# 3
print(numbers.count(200))
# 2
print(numbers.count(500))
# 5
print(numbers.count(999))
# 1
В программировании, как и в жизни, проще работать с упорядоченными данными, в них легче ориентироваться и что-либо искать. Метод sort()
сортирует список по возрастанию значений его элементов.
numbers = [100, 2, 11, 9, 3, 1024, 567, 78]
numbers.sort()
print(numbers)
# [2, 3, 9, 11, 78, 100, 567, 1024]
fruits = ['Orange', 'Grape', 'Peach', 'Banan', 'Apple']
fruits.sort()
print(fruits)
# ['Apple', 'Banan', 'Grape', 'Orange', 'Peach']
Мы можем изменять порядок сортировки с помощью параметра reverse
. По умолчанию этот параметр равен False
fruits = ['Orange', 'Grape', 'Peach', 'Banan', 'Apple']
fruits.sort()
print(fruits)
# ['Apple', 'Banan', 'Grape', 'Orange', 'Peach']
fruits.sort(reverse=True)
print(fruits)
# ['Peach', 'Orange', 'Grape', 'Banan', 'Apple']
Иногда нам нужно перевернуть список, не спрашивайте меня зачем... Для этого в самом лучшем языке программирования на этой планете JavaScr..Python
есть метод reverse()
:
numbers = [100, 2, 11, 9, 3, 1024, 567, 78]
numbers.reverse()
print(numbers)
# [78, 567, 1024, 3, 9, 11, 2, 100]
fruits = ['Orange', 'Grape', 'Peach', 'Banan', 'Apple']
fruits.reverse()
print(fruits)
# ['Apple', 'Banan', 'Peach', 'Grape', 'Orange']
Допустим, у нас есть два списка и нам нужно их объединить. Программисты на C++
cразу же кинулись писать циклы for
, но мы пишем на python
, а в python
у списков есть полезный метод extend()
. Этот метод вызывается для одного списка, а в качестве аргумента ему передается другой список, extend()
записывает в конец первого из них начало второго:
fruits = ['Banana', 'Apple', 'Grape']
vegetables = ['Tomato', 'Cucumber', 'Potato', 'Carrot']
fruits.extend(vegetables)
print(fruits)
# ['Banana', 'Apple', 'Grape', 'Tomato', 'Cucumber', 'Potato', 'Carrot']
В природе существует специальный метод для очистки списка — clear()
fruits = ['Banana', 'Apple', 'Grape']
vegetables = ['Tomato', 'Cucumber', 'Potato', 'Carrot']
fruits.clear()
vegetables.clear()
print(fruits)
# []
print(vegetables)
# []
Осталось совсем чуть-чуть всего лишь пара методов, так что делаем последний рывок! Метод index()
возвращает индекс элемента. Работает это так: вы передаете в качестве аргумента в index()
значение элемента, а метод возвращает его индекс:
fruits = ['Banana', 'Apple', 'Grape']
print(fruits.index('Apple'))
# 1
print(fruits.index('Banana'))
# 0
print(fruits.index('Grape'))
# 2
Финишная прямая! Метод copy()
, только не падайте, копирует список и возвращает его брата-близнеца. Вообще, копирование списков - это тема достаточно интересная, давайте рассмотрим её по-подробнее.
Во-первых, если мы просто присвоим уже существующий список новой переменной, то на первый взгляд всё выглядит неплохо:
fruits = ['Banana', 'Apple', 'Grape']
new_fruits = fruits
print(fruits)
# ['Banana', 'Apple', 'Grape']
print(new_fruits)
# ['Banana', 'Apple', 'Grape']
Но есть одно маленькое "НО":
fruits = ['Banana', 'Apple', 'Grape']
new_fruits = fruits
fruits.pop()
print(fruits)
# ['Banana', 'Apple']
print(new_fruits)
# Внезапно, из списка new_fruits исчез последний элемент
# ['Banana', 'Apple']
При прямом присваивании списков копирования не происходит. Обе переменные начинают ссылаться на один и тот же список! То есть если мы изменим один из них, то изменится и другой. Что же тогда делать? Пользоваться методом copy()
, конечно:
fruits = ['Banana', 'Apple', 'Grape']
new_fruits = fruits.copy()
fruits.pop()
print(fruits)
# ['Banana', 'Apple']
print(new_fruits)
# ['Banana', 'Apple', 'Grape']
Отлично! Но что если у нас список в списке? Скопируется ли внутренний список с помощью метода copy()
— нет:
fruits = ['Banana', 'Apple', 'Grape', ['Orange','Peach']]
new_fruits = fruits.copy()
fruits[-1].pop()
print(fruits)
# ['Banana', 'Apple', 'Grape', ['Orange']]
print(new_fruits)
# ['Banana', 'Apple', 'Grape', ['Orange']]