Как изменить список в 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 есть несколько способов изменить список.
В этом гайде мы рассмотрели все методы.