Как изменить список в Python

Вступление

Python – гибкий язык, и обычно существует несколько способов выполнения одной и той же задачи.

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

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

Измените список, используя метод reverse()

Python обладает мощной встроенной библиотекой методов, когда дело доходит до манипулирования данными в структурах данных. Для изменения списка мы можем использовать встроенный метод reverse().

Примечание: метод reverse() изменяет исходный список.

Из-за этого мы не можем присвоить результирующий объект новой переменной, и если вы хотите сохранить исходный список в памяти, вам придется скопировать его перед изменением:

my_list = [1, 2, 3, 4]
my_list.reverse()
print(my_list) # Output: [4, 3, 2, 1]

new_list = my_list.reverse()
print(new_list) # Output: None

Возвращаемого значения нет – список изменён. Однако мы можем воспользоваться copy():

list_1 = [1, 2, 3, 4]
list_2 = list_1.copy()

list_1.reverse()

print('Reversed list: ', list_1)
print('Saved original list: ', list_2)

Наш результат:

Reversed list:  [4, 3, 2, 1]
Saved original list:  [1, 2, 3, 4]

Измените список, используя нотацию среза

Нотация среза позволяет нам срезать и воспроизводить части различных коллекций или объектов на основе коллекций в Python, таких как списки, строки, кортежи и массивы NumPy.

Когда вы срезаете список, часть этого списка возвращается, и каждый элемент step включается:

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

# list[start:end:step]
segment_1 = my_list[1:5:1]
segment_2 = my_list[1:5:2]

print(segment_1)
print(segment_2)

Результат:

[2, 3, 4, 5]
[2, 4]

Опуская аргументы start и end, вы можете включить весь список. И, поменяв step на отрицательное число, вы получите список в обратном порядке. Если вы соедините их вместе:

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

reversed_list = original_list[::-1]
print('Original list: ', original_list)
print('Reversed list: ', reversed_list)

Результат:

Original list:  [1, 2, 3, 4, 5, 6]
Reversed list:  [6, 5, 4, 3, 2, 1]

Нотация среза вообще не влияет на исходный список, поэтому original_list остается неизменным даже после операции.

Измените список с помощью метода slice()

Метод slice() принимает те же параметры – start, end и step, и выполняет почти ту же операцию, что и нотация среза. Хотя, вместо того, чтобы опускать аргументы start и end, вы можете вписать None.

Его возвращаемый тип – объект Slice, который затем можно использовать для среза списка в соответствии с его содержимым. Он не вызывается в списке, котором вы срезаете – вы передаете его объекту Slice после создания, что позволяет создавать один многоразовый и вызываемый объект для множества разных списков.

Он внутренне преобразован в нотацию среза, так что конечный результат тот же:

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

slice_obj = slice(None, None, -1)

print('slice_obj type:', type(slice_obj))
print('Reversed list:', original_list[slice_obj])

Результат:

slice_obj type: <class 'slice'>
Reversed list: [6, 5, 4, 3, 2, 1]

Измените список, используя цикл For

В зависимости от того, хотим ли мы сохранить исходный список, мы можем извлечь (pop()) элементы из исходного списка и добавить их в новый, или мы можем просто добавить их в обратном порядке.

pop() удаляет последний элемент из коллекции и возвращает его. Мы можем объединить метод append() с этим, чтобы напрямую добавить удаленный элемент в новый список, что фактически приведет к обратному списку:

original_list = [1, 2, 3, 4] 
reversed_list = []

for i in range(len(original_list)):
    reversed_list.append(original_list.pop())

print(reversed_list) # Output: [4, 3, 2, 1]

В качестве альтернативы мы можем выполнить итерацию по списку в обратном направлении, до 0-го индекса (включительно), и добавить каждый элемент, который мы видим в этом списке. Метод range() принимает 3 аргумента – start, end и step, которые снова можно использовать почти так же, как и раньше:

original_list = [1, 2, 3, 4]
reversed_list = []

for i in range(len(original_list)-1, -1, -1):
    reversed_list.append(original_list[i])

print(reversed_list) # Output: [4, 3, 2, 1]

Изменение списка с помощью метода reversed()

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

Метод reversed() возвращает итератор, повторяющий список в обратном порядке – и мы можем легко добавить эти элементы в новый список:

original_list = [1, 2, 3, 4]
new_list = []

for i in reversed(original_list):
	new_list.append(i)
    
print(new_list) # Output: [4, 3, 2, 1]
print(original_list) # Output: [1, 2, 3, 4] --> Original hasn't changed

Заключение

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

В этом гайде мы рассмотрели все методы.

Ответить