Python's .append(): Добавляйте элементы в свои списки на месте
Оглавление
- добавление элементов в список с помощью Python's. append()
- заполнение списка с нуля
- > Создание стеков и очередей с помощью Python's. append()
- использование .append() в других структурах данных
- заключение
Смотрите сейчас, к этому уроку прилагается соответствующий видеокурс, созданный командой Real Python. Просмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Создание списков с помощью Python .append()
Добавление элементов в список - довольно распространенная задача в Python, поэтому язык предоставляет множество методов и операторов, которые могут помочь вам с этой операцией. Одним из таких методов является .append(). С помощью .append() вы можете добавлять элементы в конец существующего объекта списка. Вы также можете использовать .append() в цикле for для заполнения списков программным способом.
В этом руководстве вы узнаете, как:
- Работайте с
.append() - заполнить список, используя
.append()иforпетли - Заменить
.append()на список значений - Работайте с
.append()вarray.array()иcollections.deque()
Вы также напишете несколько примеров того, как использовать .append() на практике. Обладая этими знаниями, вы сможете эффективно использовать .append() в своих программах.
Скачать бесплатно: Ознакомьтесь с примером главы из книги "Основы Python: практическое введение в Python 3", чтобы увидеть, как вы можете перейти от начального уровня перейти на промежуточный уровень в Python с полной учебной программой, обновленной для Python 3.8.
Добавление элементов в список с помощью Python .append()
В Python .append() принимает объект в качестве аргумента и добавляет его в конец существующего списка, сразу после его последнего элемента:
>>> numbers = [1, 2, 3] >>> numbers.append(4) >>> numbers [1, 2, 3, 4]предварительно> кодовый блок>Каждый раз, когда вы вызываете
.append()для существующего списка, метод добавляет новый элемент в конец или правую часть списка. На следующей диаграмме показан процесс:![]()
Списки Python резервируют дополнительное пространство для новых элементов в конце списка. Вызов
.append()приведет к размещению новых элементов в доступном пространстве.На практике вы можете использовать
.append()для добавления любого объекта в заданный список:>>> mixed = [1, 2] >>> mixed.append(3) >>> mixed [1, 2, 3] >>> mixed.append("four") >>> mixed [1, 2, 3, 'four'] >>> mixed.append(5.0) >>> mixed [1, 2, 3, 'four', 5.0]предварительно> кодовый блок>Списки - это последовательности, которые могут содержать различные типы данных и объекты Python, поэтому вы можете использовать
.append()для добавления любого объекта в данный список. В этом примере сначала добавляется целое число, затем строка и, наконец, число с плавающей запятой. Однако вы также можете добавить другой список, словарь , кортеж, пользовательский объект и так далее.Использование
.append()эквивалентно следующей операции:>>> numbers = [1, 2, 3] >>> # Equivalent to numbers.append(4) >>> numbers[len(numbers):] = [4] >>> numbers [1, 2, 3, 4]предварительно> кодовый блок>В выделенной строке вы выполняете две операции одновременно:
- Вы берете фрагмент из
numbers, используя выражениеnumbers[len(numbers):].- , и присваиваете этому фрагменту повторяемость.
Операция нарезки занимает пробел после последнего элемента в
numbers. Тем временем операция присваивания распаковывает элементы в списке справа от оператора присваивания и добавляет их вnumbers. Однако есть важное различие между использованием такого рода заданий и использованием.append(). С помощью этого задания вы можете добавить в конец своего списка сразу несколько элементов:>>> numbers = [1, 2, 3] >>> numbers[len(numbers):] = [4, 5, 6] >>> numbers [1, 2, 3, 4, 5, 6]предварительно> кодовый блок>В этом примере выделенная строка берет фрагмент из конца
numbers, распаковывает элементы в списке справа и добавляет их в фрагмент как отдельные элементы.
.append()Добавляет один элементС помощью
.append()вы можете добавить число, список, кортеж, словарь, пользовательский объект или любой другой объект в существующий список. Однако вам нужно иметь в виду, что.append()одновременно добавляет только один элемент или объект:>>> x = [1, 2, 3, 4] >>> y = (5, 6) >>> x.append(y) >>> x [1, 2, 3, 4, (5, 6)]предварительно> кодовый блок>Здесь происходит следующее:
.append()добавляет объект кортежаyв конец вашего целевого списка,x. Что, если вы хотите добавить каждый элемент изyв конецxкак отдельный элемент и получить[1, 2, 3, 4, 5, 6]? В этом случае вы можете использовать.extend():>>> x = [1, 2, 3, 4] >>> y = (5, 6, 7) >>> x.extend(y) >>> x [1, 2, 3, 4, 5, 6, 7] >>> x = [1, 2, 3, 4] >>> y = (5, 6, 7) >>> # Equivalent to x.extend(y) >>> x[len(x):] = y >>> x [1, 2, 3, 4, 5, 6, 7]предварительно> кодовый блок>
.extend()принимает iterable в качестве аргумента, распаковывает его элементы и добавляет их в конец вашего целевого списка. Эта операция эквивалентнаx[len(x):] = y, которая представляет собой ту же технику, которую вы видели в предыдущем разделе.
.append()ВозвращаетNoneНа практике
.append()выполняет свою работу на месте, изменяя и расширяя базовый список. Это означает, что.append()не возвращает новый список с дополнительным новым элементом в конце. Он возвращаетсяNone:>>> x = [1, 2, 3, 4] >>> y = x.append(5) >>> y is None True >>> x [1, 2, 3, 4, 5]предварительно> кодовый блок>Как и в случае с несколькими аналогичными методами,
.append()изменяет базовый список на месте. Попытка использовать возвращаемое значение.append()является распространенной ошибкой, когда речь заходит о изучении того, как работают изменяемые типы последовательностей. Если вы будете помнить об этом поведении.append(), это поможет вам предотвратить ошибки в вашем коде.Заполнение списка с нуля
Распространенная проблема, с которой вы можете столкнуться при работе со списками в Python, заключается в том, как заполнить их несколькими элементами для дальнейшей обработки. Для этого есть два способа:
- Используйте
.append()иforцикл- Используйте понимание списка
В следующих нескольких разделах вы узнаете, как и когда использовать эти методы для создания и заполнения списков Python с нуля.
Используя
.append()Одним из распространенных вариантов использования
.append()является полное заполнение пустого списка с помощью циклаfor. Внутри цикла вы можете манипулировать данными и использовать.append()для добавления последовательных результатов в список. Допустим, вам нужно создать функцию, которая принимает последовательность чисел и возвращает список, содержащий квадратный корень из каждого числа:>>> import math >>> def square_root(numbers): ... result = [] ... for number in numbers: ... result.append(math.sqrt(number)) ... return result ... >>> numbers = [1, 4, 9, 16, 25, 36, 49, 64, 81] >>> square_root(numbers) [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]предварительно> кодовый блок>Здесь вы определяете
square_root(), который принимает списокnumbersв качестве аргумента. Внутриsquare_root()вы создаете пустой список с именемresultи запускаете циклfor, который повторяет элементы вnumbers. На каждой итерации вы используетеmath.sqrt()для вычисления квадратного корня из текущего числа, а затем используете.append(), чтобы добавить результат кresult. Как только цикл завершится, вы вернете результирующий список.Примечание: В приведенном выше примере вы используете
sqrt()изmath. Модуль Pythonmathпоставляется в стандартной библиотеке и предоставляет функции, связанные с математикой. Если вы хотите глубже погрузиться вmath, ознакомьтесь с Математическим модулем Python: все, что вам нужно знать.Этот способ заполнения списков довольно распространен в Python. Однако язык предоставляет несколько удобных конструкций, которые могут сделать этот процесс намного более эффективным и питоническим. Одной из таких конструкций является понимание списка, которое вы увидите в действии в следующем разделе.
Использование понимания списка
На практике при создании списка с нуля и его заполнении вы часто заменяете
.append()на понимание списка. Разобравшись со списком, вы можете переопределитьsquare_root()следующим образом:>>> import math >>> def square_root(numbers): ... return [math.sqrt(number) for number in numbers] ... >>> numbers = [1, 4, 9, 16, 25, 36, 49, 64, 81] >>> square_root(numbers) [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]предварительно> кодовый блок>При составлении списка внутри
square_root()создается список, содержащий квадратный корень изnumberдля каждогоnumberвnumbers. Это читается почти как обычный английский. Кроме того, эта новая реализация будет более эффективной с точки зрения времени обработки, чем реализация, использующая.append()вместе сforциклом.Примечание: Python также предлагает другие виды выражений, такие как выражения для набора, словарные выражения и выражения-генераторы.
Чтобы превратить
.append()в понятный список, вам просто нужно поместить его аргумент, за которым следует заголовок цикла (без двоеточия), в пару квадратных скобок.Переключение обратно в режим
.append()Несмотря на то, что использование списков может быть более удобным и эффективным, чем
.append()для заполнения списков, могут возникнуть ситуации, когда.append()является лучшим выбором.Предположим, вам нужно
square_root()предоставить вашим пользователям подробную информацию о ходе вычисления квадратного корня из введенного списка чисел. Чтобы сообщить о ходе выполнения операции, вы можете использоватьprint():>>> import math >>> def square_root(numbers): ... result = [] ... n = len(numbers) ... for i, number in enumerate(numbers): ... print(f"Processing number: {number}") ... result.append(math.sqrt(number)) ... print(f"Completed: {int((i + 1) / n * 100)}%") ... return result ... >>> numbers = [1, 4, 9, 16, 25, 36, 49, 64, 81] >>> square_root(numbers) Processing number: 1 Completed: 11% ... Processing number: 81 Completed: 100% [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]предварительно> кодовый блок>Теперь подумайте, как вы можете преобразовать текст
square_root()в понятный список. Использованиеprint()внутри понятного списка не кажется логичным или даже возможным, если вы не заключите часть кода во вспомогательную функцию. Итак, в этом примере использование.append()является правильным выбором.Мораль приведенного выше примера заключается в том, что в некоторых ситуациях вы не можете заменить
.append()на понимание списка или на любую другую конструкцию.Создание стеков и очередей с помощью Python
.append()Итак, вы узнали, как использовать
.append()для добавления отдельного элемента в список или для заполнения списков с нуля. Теперь пришло время для другого, более конкретного примера. В этом разделе вы узнаете, как использовать список Python для создания стековых и очередных структур данных с минимально необходимой функциональностью, используя.append()и.pop().Реализация стека
Стек - это структура данных, в которой элементы хранятся друг над другом. Элементы поступают в стопку и извлекаются из нее в порядке Последний вход /Первый выход. ( ЛИФО) мода. Как правило, стек реализует две основные операции:
pushдобавляет элемент в начало или конец стека.popудаляет и возвращает элемент, находящийся в верхней части стека.В списке
.append()эквивалентно операцииpush, поэтому вы можете использовать ее для перемещения элементов в стек. Списки также содержат.pop(), который необязательно принимает в качестве аргумента целочисленный индекс. Он возвращает элемент с таким индексом в базовом списке, а также удаляет элемент:>>> numbers = [1, 2, 3] >>> numbers.pop(1) 2 >>> numbers [1, 3] >>> numbers.pop() 3 >>> numbers [1] >>> numbers.pop() 1 >>> numbers [] >>> numbers.pop() Traceback (most recent call last): File "<input>", line 1, in <module> numbers.pop() IndexError: pop from empty listпредварительно> кодовый блок>Если вы укажете целочисленный индекс в качестве аргумента для
.pop(), то метод вернет и удалит элемент с этим индексом в списке. Вызов.pop()без аргумента возвращает последний элемент в списке. Обратите внимание, что.pop()также удаляет элемент из основного списка. Наконец, если вы вызовете.pop()в пустом списке, то получитеIndexError.Обладая этими знаниями, вы готовы реализовать стек, используя
.append()и.pop(). Вот класс, который определяет стек. Класс предоставляет.push()и.pop()операции:class Stack: def __init__(self): self._items = [] def push(self, item): self._items.append(item) def pop(self): try: return self._items.pop() except IndexError: print("Empty stack") def __len__(self): return len(self._items) def __repr__(self): return f"Stack({self._items})"предварительно> кодовый блок>В
Stackсначала вы инициализируете атрибут экземпляра._items. Этот атрибут содержит пустой список, который вы будете использовать для хранения элементов в стеке. Затем вы создаете код.push(), который реализует операциюpush, используя.append()на._items.Вы также реализуете операцию
pop, вызывая.pop()в базовом списке,._items. В этом случае вы используетеtryиexceptблок для обработкиIndexError, который возникает при вызове.pop()в пустом списке.Примечание: В Python использование исключений для управления потоком выполнения программы является распространенным шаблоном. Разработчики Python предпочитают этот стиль программирования, известный как EAFP (Легче попросить прощения, чем разрешения), стилю программирования, известному как LBYL (Посмотри, прежде чем прыгать). Чтобы узнать больше об этих двух стилях программирования, ознакомьтесь с LBYL vs EAFP: Предотвращение или обработка ошибок в Python.
EAFP может помочь вам предотвратить сбои в работе, повысить общую производительность программы или фрагмента кода и предотвратить передачу ошибок без предупреждения.
Здесь вы можете воспользоваться несколькими специальными методами. Специальный метод
.__len__()предоставляет необходимую функциональность для получения длины внутреннего списка._items. Специальный метод.__repr__()позволяет обеспечить удобное для пользователя строковое представление стека при выводе структуры данных на экран.Вот несколько примеров того, как вы можете использовать
Stackна практике:>>> stack = Stack() >>> # Push items onto the top of the stack >>> stack.push(1) >>> stack.push(2) >>> # User-friendly printing format >>> stack Stack([1, 2]) >>> print(stack) Stack([1, 2]) >>> # Retrieve the length of the stack >>> len(stack) 2 >>> # Pop items from the top of the stack >>> stack.pop() 2 >>> stack.pop() 1 >>> stack.pop() Empty stack >>> stack Stack([])предварительно> кодовый блок>Вот и все! Вы закодировали структуру стековых данных, которая реализует операции
pushиpop. Он также предоставляет функциональные возможности для получения длины базового списка и удобной для пользователя печати всей стопки.Реализация очереди
Очереди - это структуры данных, которые обычно управляют своими элементами по принципу Первый вход/первый выход (FIFO). Очереди работают как труба, в которую вы вставляете новые элементы с одного конца, а старые элементы выскакивают с другого конца.
Добавление элемента в конец очереди называется операцией
enqueue, а удаление элемента из начала очереди называется операцией adequeue.Вы можете помещать элементы в очередь, используя
.append(), и выводить их из очереди, используя.pop(). На этот раз вам нужно указать0в качестве аргумента для.pop()просто для того, чтобы он извлекал первый элемент в списке вместо последнего элемента. Вот класс, который реализует структуру данных очереди, используя список для хранения своих элементов:class Queue: def __init__(self): self._items = [] def enqueue(self, item): self._items.append(item) def dequeue(self): try: return self._items.pop(0) except IndexError: print("Empty queue") def __len__(self): return len(self._items) def __repr__(self): return f"Queue({self._items})"предварительно> кодовый блок>Этот класс очень похож на ваш
Stack. Основное отличие заключается в том, что.pop()принимает0в качестве аргумента для возврата и удаляет первый элемент в базовом списке,._items, а не предыдущий. последний.Примечание: Использование
.pop(0)в списке Python - не самый эффективный способ использования элементов списка. К счастью, модуль Pythoncollectionsпредоставляет структуру данных под названиемdeque(),, которая реализует.popleft()как эффективный способ использования элементов с самого начала процесса.deque().Вы узнаете больше об использовании deques чуть позже в этом руководстве.
Остальная часть реализации практически идентична, но использует соответствующие имена, такие как
.enqueue()для добавления элементов и.dequeue()для их удаления. Вы можете использоватьQueueтак же, как вы использовалиStackв предыдущем разделе: просто вызовите.enqueue()для добавления элементов и.dequeue()для их извлечения и удаления.Использование
.append()в других структурах данныхДругие структуры данных Python также реализуют
.append(). Принцип работы такой же, как и у традиционного.append()в виде списка. Метод добавляет один элемент в конец базовой структуры данных. Однако есть некоторые тонкие различия.В следующих двух разделах вы узнаете, как
.append()работает в других структурах данных, таких какarray.array()иcollections.deque().
array.append()Python
array.array()предоставляет структуру данных, подобную последовательности, которая может компактно представлять массив значений. Эти значения должны быть одного и того же типа данных , который ограничен типами данных в стиле C, такими как символы, целые числа и числа с плавающей запятой.
array.array()принимает следующие два аргумента:
Argument Content Required typecodeA single-character code that identifies the data type that the array can store Yes initializerA list, bytes-like object, or iterable that serves as an initializer No Документация по
arrayсодержит полную информацию обо всех допустимых кодах типов, которые вы можете использовать при создании массивов. В следующем примере используется код типа"i"для создания массива целых чисел:>>> from array import array >>> # Array of integer numbers >>> int_array = array("i", [1, 2, 3]) >>> int_array array('i', [1, 2, 3]) >>> int_array[0] 1 >>> int_array[:2] array('i', [1, 2]) >>> int_array[2] = 4 >>> int_array array('i', [1, 2, 4])предварительно> кодовый блок>Чтобы создать массив, вам необходимо ввести односимвольный код для определения типа данных значений в массиве. Вы также можете указать необязательный список значений с соответствующим типом для инициализации массива.
Массивы поддерживают большинство операций со списками, таких как нарезка и индексация. Как и lists,
array.array()также предоставляет метод с именем.append(). Этот метод работает аналогично своему аналогу list, добавляя единственное значение в конец базового массива. Однако значение должно иметь тип данных, совместимый с существующими значениями в массиве. В противном случае вы получитеTypeError.Например, если у вас есть массив с целыми числами, то вы не можете использовать
.append()для добавления к этому массиву числа с плавающей запятой:>>> from array import array >>> a = array("i", [1, 2, 3]) >>> a array('i', [1, 2, 3]) >>> # Add a floating-point number >>> a.append(1.5) Traceback (most recent call last): File "<input>", line 1, in <module> a.append(1.5) TypeError: integer argument expected, got floatпредварительно> кодовый блок>Если вы попытаетесь добавить число с плавающей запятой к
a, то.append()завершится ошибкой сTypeError. Это связано с тем, что Python не может автоматически преобразовать число с плавающей запятой в целое число без потери информации.Напротив, если у вас есть массив с числами с плавающей запятой и вы попытаетесь добавить к нему целые числа, то ваша операция завершится успешно:
>>> from array import array >>> float_array = array("f", [1.0, 2.0, 3.0]) >>> float_array array('f', [1.0, 2.0, 3.0]) >>> # Add and integer number >>> float_array.append(4) >>> float_array array('f', [1.0, 2.0, 3.0, 4.0])предварительно> кодовый блок>Здесь вы используете
.append()для добавления целого числа к массиву чисел с плавающей запятой. Это возможно, потому что Python может автоматически преобразовывать целые числа в числа с плавающей запятой без потери информации в процессе.
deque.append()иdeque.appendleft()
collections.deque()это еще одна структура данных, которая реализует вариацию.append(). Adequeпредставляет собой обобщение стека и очереди, специально разработанных для поддержки быстрых и экономичных с точки зрения памяти операцийappendиpopс обеих сторон. Поэтому, если вам нужно создать структуру данных с этими функциями, рассмотрите возможность использования deque вместо списка.Примечание: Название deque произносится как “палуба” и расшифровывается как dрезультат-енайдено чтои т.д.
collections.deque()принимает следующие два необязательных аргумента:
Argument Content iterableAn iterable that serves as an initializer maxlenAn integer number that specifies the maximum length of the deque Если вы укажете значение
maxlen, то в вашем deque будет храниться толькоmaxlenэлементов. Как только список будет заполнен, добавление нового товара автоматически приведет к тому, что товар, находящийся на противоположном конце списка, будет отброшен. С другой стороны, если вы не укажете значениеmaxlen, то список может увеличиться до произвольного количества элементов.В deques
.append()также добавляет один элемент в конец или правую часть базовой структуры данных:>>> from collections import deque >>> d = deque([1, "a", 3.0]) >>> d deque([1, 'a', 3.0]) >>> d.append("b") >>> d deque([1, 'a', 3.0, 'b'])предварительно> кодовый блок>Как и списки, в deque могут содержаться элементы разных типов, поэтому
.append()добавляет произвольные элементы в конец deque. Другими словами, с помощью.append()вы можете добавить в deque любой объект.Помимо
.append(), в deques также есть.appendleft(),, который добавляет один элемент в начало или левую часть deques. Аналогично, в разделах deque предусмотрены.pop()и.popleft()для удаления элементов с правой и левой сторон раздела deque, соответственно:>>> from collections import deque >>> d = deque([1, "a", 3.0]) >>> d.appendleft(-1.0) >>> d deque([-1.0, 1, 'a', 3.0]) >>> d.pop() 3.0 >>> d.popleft() -1.0 >>> d deque([1, 'a'])предварительно> кодовый блок>Вызов
.appendleft()добавляет-1.0к левой частиd. С другой стороны,.pop()возвращает и удаляет последний элемент вd, а.popleft()возвращает и удаляет первый элемент. В качестве упражнения вы можете попробовать реализовать свой собственный стек или очередь, используя deque вместо списка. Чтобы сделать это, вы можете воспользоваться примерами, которые вы видели в разделе Создание стеков и очередей с помощью Python .append().Заключение
Python предоставляет метод с именем
.append(), который вы можете использовать для добавления элементов в конец заданного списка. Этот метод широко используется либо для добавления отдельного элемента в конец списка, либо для заполнения списка с помощью циклаfor. Изучение того, как использовать.append(), поможет вам обрабатывать списки в ваших программах.В этом уроке вы узнали:
- Как
.append()работает- Как заполнять списки, используя
.append()вместе сforциклом- Когда следует заменить
.append()на понимание списка- Как
.append()работает вarray.array()иcollections.deque()Кроме того, вы написали несколько примеров того, как использовать
<завершенный статус статьи-slug=" python-append "класс=" btn-group mb-0" data-api-article-bookmark-url= "/ api / v1/статьи / python-append/bookmark/ " data-api-article-завершение-статус-url="/api / v1/статьи / python-добавление/завершение_статус/ " > статус завершения> <кнопка поделиться bluesky-text="Интересная статья на #Python от @realpython.com :" email-body="Ознакомьтесь с этой статьей о Python:%0A%0apython's .append(): Добавляйте элементы в свои списки на месте" email-subject="Статья о Python для вас" twitter-текст="Интересная статья на #Python от @realpython:" url="https://realpython.com/python-append/" url-title="Python's .append(): Добавляйте элементы в свои списки на месте"> кнопка поделиться>.append()для создания структур данных, таких как стеки и очереди. Эти знания позволят вам использовать.append()для эффективного расширения ваших списков.Смотрите сейчас, к этому уроку прилагается соответствующий видеокурс, созданный командой Real Python. Просмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Создание списков с помощью Python .append()
Back to Top
