Как вы можете не один, кроме нескольких элементов в данный список? Используйте продлить ()
Метод в Python. В этом руководстве показано вам все, что вам нужно знать, чтобы помочь вам овладеть необходимым методом наиболее фундаментального типа контейнера данных в языке программирования Python.
Определение и использование
list.exdend (iTer)
Метод добавляет все элементы в аргументе Iterable ИТЕР
к существующему Список
Отказ
Вот краткий пример:
>>> lst = [1, 2, 3] >>> lst.extend([4, 5, 6]) >>> lst [1, 2, 3, 4, 5, 6]
В первой строке примера вы создаете список lst
Отказ Вы тогда добавляете целые числа 4, 5, 6
до конца списка, используя продлить ()
метод. Результатом является список с шестью элементами [1, 2, 3, 4, 5, 6]
Отказ
Синтаксис
Вы можете вызвать этот метод на каждом объекте списка в Python. Вот синтаксис:
list.extence (потенциал)
Аргументы
считать | Все элементы Iterable будут добавлены в конец списка – в порядке их возникновения. |
видео
Код головоломки
Теперь вы знаете основы. Давайте углубим ваше понимание с коротким кодом головоломки – можешь решить это?
# Puzzle # Author: Finxter Lee lst1 = [1, 2, 3] lst2 = [4, 5, 6] lst1.append(lst2) lst3 = [1, 2, 3] lst4 = [4, 5, 6] lst3.extend(lst4) print(lst1 == lst3) # What's the output of this code snippet?
Вы можете проверить решение на Приложение Finxter Отказ (Я знаю, что это сложно!)
Примеры
Давайте погрузимся в несколько примеров:
>>> lst = [1, 2, 3] >>> lst.extend({32, 42}) >>> lst [1, 2, 3, 32, 42] >>> lst.extend((1, 2)) >>> lst [1, 2, 3, 32, 42, 1, 2] >>> lst.extend(range(10,13)) >>> lst [1, 2, 3, 32, 42, 1, 2, 10, 11, 12] >>> lst.extend(1) Traceback (most recent call last): File "", line 1, in lst.extend(1) TypeError: 'int' object is not iterable >>>
Вы можете увидеть, что продлить ()
Способ обеспечивает все виды повторных документов: списков, множеств, кортежей и даже объекты диапазона. Но то, что он не позволяет, это целочисленный аргумент. Почему? Поскольку целочисленный аргумент не является нетефилизируемым – это не имеет смысла «итерации за все значения в целом».
Статьи по Теме:
- Окончательное руководство по спискам Python
Вот ваш бесплатный PDF чит-лист, показывающий вас все методы списка Python на одной простой странице. Нажмите на изображение, чтобы загрузить файл PDF с высоким разрешением, распечатать его и опубликовать его в свою офисную стену:
Python List Extend () в начале
Что, если вы хотите использовать метод Extend () в начале: вы хотите «добавить» ряд элементов непосредственно перед первым элементом списка.
Ну, вы должны работать над своей терминологией для начала. Но если вы настаиваете, вы можете использовать Вставить ()
Метод вместо этого.
Вот пример:
>>> lst = [1, 2, 3] >>> lst.insert(0, 99) >>> lst [99, 1, 2, 3]
Вставить (я, х)
Способ вставляет элемент х
На позиции Я
в списке. Таким образом, вы можете вставить элемент в каждую позицию в списке – даже в первой позиции. Обратите внимание, что если вы введете элемент в первую позицию, каждый последующий элемент будет перемещен на одну позицию. Другими словами, элемент Я
Перейдет в положение Я + 1
Отказ
Список Python Extend () VS +
Список оператор конкатенации +: Если вы используете оператор + на два целых числа, вы получите сумму этих целых чисел. Но если вы используете оператор + в двух списках, вы получите новый список, который является конкатенацией этих списков.
l1 = [1, 2, 3] l2 = [4, 5, 6] l3 = l1 + l2 print(l3)
Выход:
[1, 2, 3, 4, 5, 6]
Проблема с оператором + для Concatenation в списке состоит в том, что он создает новый список для каждого операции конкатенации списка. Это может быть очень неэффективным, если вы используете оператор + несколько раз в цикле.
Как быстро используется оператор +? Вот общий сценарий, как люди используют его, чтобы добавить новые элементы в список в цикле. Это очень неэффективно:
import time start = time.time() l = [] for i in range(100000): l = l + [i] stop = time.time() print("Elapsed time: " + str(stop - start))
Выход:
Elapsed time: 14.438847541809082
Эксперименты проводились на моем ноутбуке с процессором INTEL (R) CORE (TM) I7-8565U 1,8 ГГц (с Turbo Boost до 4,6 ГГц) и 8 ГБ ОЗУ.
Я измерил The Start и Stop Timestams, чтобы рассчитать общее прошедшее время для добавления 100 000 элементов в список.
Результат показывает, что для выполнения этой операции требуется 14 секунд.
Это кажется медленно (это!). Итак, давайте расследовать некоторые другие методы объединения и их производительности:
Python List Extend () производительность
Вот аналогичный пример, который показывает, как вы можете использовать продлить ()
Способ для объединения двух списков L1
и L2
Отказ
l1 = [1, 2, 3] l2 = [4, 5, 6] l1.extend(l2) print(l1)
Выход:
[1, 2, 3, 4, 5, 6]
Но это тоже быстро? Давайте проверим производительность!
Представление:
Я выполнил аналогичный эксперимент, как и раньше для оператора Concatenation перечисления +
Отказ
import time start = time.time() l = [] l.extend(range(100000)) stop = time.time() print("Elapsed time: " + str(stop - start))
Выход:
Elapsed time: 0.0
Я измерил The Start и Stop Timestams, чтобы рассчитать общее прошедшее время для добавления 100 000 элементов в список.
Результат показывает, что требуется незначительное время для запуска кода (0,0 секунд по сравнению с 0,006 секунды для работы Append ()
выше).
То продлевать() Метод является наиболее лаконичным и самым быстрым способом объединения списков.
Python List Append () VS Extend ()
Я застрелил небольшое видео, объясняя разницу, а какой метод тоже быстрее:
Метод list.append (x)
Добавляет элемент х
до конца Список
Отказ
Метод list.exdend (iTer)
Добавляет все элементы в ИТЕР
до конца Список
Отказ
Разница между Приложение () и продлевать() Это то, что первое добавляет только один элемент, а последний добавляет коллекцию элементов в список.
Вы можете увидеть это в следующем примере:
>>> l = [] >>> l.append(1) >>> l.append(2) >>> l [1, 2] >>> l.extend([3, 4, 5]) >>> l [1, 2, 3, 4, 5]
В коде вы впервые добавляете целочисленные элементы 1 и 2 в список, используя два вызова к Добавить ()
метод. Затем вы используете метод Extend для добавления трех элементов 3, 4 и 5 в одном вызове продлить ()
метод.
Какой метод будет быстрее – расширяет () vs plapend ()?
Чтобы ответить на этот вопрос, я написал короткий скрипт, который тестирует производительность выполнения создания крупных списков увеличения размеров с использованием продлить ()
и Добавить ()
методы.
Наш тезис в том, что продлить ()
Метод должен быть быстрее для более крупных размеров списка, потому что Python может добавить элементы в список в список, а не, вызова тот же метод снова и снова.
Я использовал свою ноутбук с процессором INTEL (R) CORE (TM) I7-8565U 1,8 ГГц (с Turbo Boost до 4,6 ГГц) и 8 ГБ ОЗУ.
Затем я создал 100 списков с обоими методами, продлить ()
и Добавить ()
, с размерами от 10 000 элементов до 1000 000 элементов. В качестве элементов я просто увеличил целочисленные числа на один, начиная с 0.
Вот код, который я использовал для измерения и сюжета результатов: какой метод быстрее – Добавить ()
или продлить ()
?
import time def list_by_append(n): '''Creates a list & appends n elements''' lst = [] for i in range(n): lst.append(n) return lst def list_by_extend(n): '''Creates a list & extends it with n elements''' lst = [] lst.extend(range(n)) return lst # Compare runtime of both methods list_sizes = [i * 10000 for i in range(100)] append_runtimes = [] extend_runtimes = [] for size in list_sizes: # Get time stamps time_0 = time.time() list_by_append(size) time_1 = time.time() list_by_extend(size) time_2 = time.time() # Calculate runtimes append_runtimes.append((size, time_1 - time_0)) extend_runtimes.append((size, time_2 - time_1)) # Plot everything import matplotlib.pyplot as plt import numpy as np append_runtimes = np.array(append_runtimes) extend_runtimes = np.array(extend_runtimes) print(append_runtimes) print(extend_runtimes) plt.plot(append_runtimes[:,0], append_runtimes[:,1], label='append()') plt.plot(extend_runtimes[:,0], extend_runtimes[:,1], label='extend()') plt.xlabel('list size') plt.ylabel('runtime (seconds)') plt.legend() plt.savefig('append_vs_extend.jpg') plt.show()
Код состоит из трех частей высокого уровня:
- В первой части кода вы определяете две функции
list_by_append (n)
иlist_by_extend (n)
которые принимают в качестве аргумента в качестве входного аргумента, размер целочисленного спискаN
и создавать списки последовательно увеличения целочисленных элементов, используяДобавить ()
ипродлить ()
Методы соответственно. - Во второй части кода вы сравниваете время выполнения обеих функций, используя 100 различных значений для размера списка
N
Отказ - В третьей части кода вы записали все, используя Python Библиотека Matplotlib Отказ
Вот результирующий график, который сравнивает время выполнения двух методов PROPEND () VS EXTEND (). На оси X вы можете увидеть размер списка от 0 до 1 000 000 элементов. На оси Y вы можете увидеть время выполнения в секундах, необходимых для выполнения соответствующих функций.
Полученный график показывает, что оба метода чрезвычайно быстры для нескольких десятков тысяч элементов. На самом деле, они настолько быстро, что Время ()
Функция модуль времени не может захватить прошедшее время.
Но, когда вы увеличиваете размер списков до сотен тысяч элементов, продлить ()
Метод начинает выиграть:
Для больших списков с одним миллионом элементов выполнение времени выполнения продлевать() Метод на 60% быстрее, чем время выполнения Приложение () метод.
Причина является уже упомянутой дозированием индивидуальных добавок.
Однако эффект воспроизводится только для очень больших списков. Для небольших списков вы можете выбрать любой метод. Ну, для ясности вашего кода, это все равно имеет смысл предпочтить продлить ()
над Добавить ()
Если вам нужно добавить кучу элементов, а не только один элемент.
Python Append список в другой список
К списку приложений lst_1
в другой список lst_2
Используйте lst_2.extend (lst_1)
метод. Вот пример:
>>> lst_1 = [1, 2, 3] >>> lst_2 = [4, 5, 6] >>> lst_2.extend(lst_1) >>> lst_2 [4, 5, 6, 1, 2, 3]
Python List Extend () не возвращает
Возвращаемое значение продлить ()
Метод это Нет
Отказ Возвращаемое значение продлить ()
Метод не является списком с добавленными элементами. Предполагая, что это общий источник ошибок.
Вот такая ошибка, когда кодер ошибочно предположил это:
>>> lst = [1, 2].extend([3, 4]) >>> lst[0] Traceback (most recent call last): File "", line 1, in lst[0] TypeError: 'NoneType' object is not subscriptable
Это не имеет смысла назначать результат продлить ()
метод другой переменной – потому что это всегда Нет
Отказ Вместо этого продлить ()
Метод изменяет объект списка без создания (и возврата) нового списка.
Вот правильная версия того же кода:
>>> lst = [1, 2] >>> lst.extend([3, 4]) >>> lst[0] 1
Теперь вы измените сам объект списка, позвонив продлить ()
Метод на нем. Вы прочь Нет
Возвращаемое значение, потому что он не нужен.
Список Python Concatenation
Таким образом, у вас есть два или более списков, и вы хотите приклеить их вместе. Это называется Список конкатенации Отказ Как вы можете это сделать?
Это шесть способов объединения списков (здесь подробный учебник):
- Список оператор конкатенации
+.
- Список
Добавить ()
метод - Список
продлить ()
метод - Звездочный оператор
*
Itertools.Chain ()
- Список понимания
a = [1, 2, 3] b = [4, 5, 6] # 1. List concatenation operator + l_1 = a + b # 2. List append() method l_2 = [] for el in a: l_2.append(el) for el in b: l_2.append(el) # 3. List extend() method l_3 = [] l_3.extend(a) l_3.extend(b) # 4. Asterisk operator * l_4 = [*a, *b] # 5. Itertools.chain() import itertools l_5 = list(itertools.chain(a, b)) # 6. List comprehension l_6 = [el for lst in (a, b) for el in lst]
Выход:
''' l_1 --> [1, 2, 3, 4, 5, 6] l_2 --> [1, 2, 3, 4, 5, 6] l_3 --> [1, 2, 3, 4, 5, 6] l_4 --> [1, 2, 3, 4, 5, 6] l_5 --> [1, 2, 3, 4, 5, 6] l_6 --> [1, 2, 3, 4, 5, 6] '''
Какой лучший способ объединить два списка?
Если вы заняты, вы можете узнать лучший ответ немедленно. Вот:
Для объединения двух списков Л1 , L2 , использовать l1.extend (l2) Метод, который является самым быстрым и наиболее читаемым.
Чтобы объединить более двух списков, используйте оператор распаковки (звездочки) [* l1, * l2, …, * ln] .
Тем не менее, вам следует избегать использования метода Append () для конкатенации списка, потому что он не очень эффективен, ни краткий и читаемый.
Список Python Extend () Уникальный – Добавить, если не существует
Общий вопрос заключается в следующем:
Как вы можете добавить или добавлять элементы в список, но только если они еще не существуют в списке?
Если игнорируя любые проблемы с производительностью, ответ прост: используйте состояние, если в сочетании с операцией членства Элемент в списке
и только Добавить () Элемент Если результат это Ложь
(Не используйте Расширение ()
для этого мелкозернистого метода). В качестве альтернативы вы также можете использовать операцию отрицательной членства Элемент не в списке
и добавить элемент, если результат – Правда
Отказ
Пример : Скажем, вы хотите добавить все элементы от 0 до 9 в список трех элементов. Но вы не хотите дубликаты. Вот как вы можете сделать это:
lst = [1, 2, 3] for element in range(10): if element not in lst: lst.append(element)
Результирующий список:
[1, 2, 3, 0, 4, 5, 6, 7, 8, 9]
Вы добавляете все элементы от 0 до 9 в список, но только если они еще не присутствуют. Таким образом, полученный список не содержит дубликатов.
Но есть проблема: этот метод очень неэффективен!
В каждой итерации петли фрагмент Элемент не в LST
Ищется весь список для текущего элемент
Отказ Для списка с N
Элементы, это результаты в N
Сравнение, на итерацию. Как у вас есть N
Итерации, сложность выполнения данного фрагмента кода является квадратичным в количестве элементов.
Вы можете сделать лучше?
Конечно, но вам нужно смотреть за пределы типа данных списка: Наборы Python здесь правильная абстракция. Если вам нужно обновить ваше основное понимание заданного типа данных, ознакомьтесь с моим подробным учебным пособием (с примерами Harry Potter) в блоге Finxter.
Почему Python отлично подходит для этого? Потому что они не позволяют никаких дубликатов на дизайн: Набор – это Уникальный Коллекция неупорядоченных элементов Отказ И Сложность времени выполнения Операции членства не является линейным в количестве элементов (как это дело для списков), но постоянные!
Пример : Скажем, вы хотите добавить все элементы от 0 до 9 до набора трех элементов. Но вы не хотите дубликаты. Вот как вы можете сделать это с наборами:
s = {1, 2, 3} for element in range(10): s.add(element) print(s)
Полученный набор:
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
Набор не позволяет дублировать записи, чтобы элементы 1, 2 и 3 не добавляются дважды на множество.
Вы даже можете сделать этот код более лаконичным:
s = {1, 2, 3} s = s.union(range(10)) print(s)
Выход:
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
Метод Union создает новый набор, который состоит из всех элементов в обеих операндах.
Теперь вы можете захотеть иметь список в результате, а не набор. Решение простое: преобразуйте результирующий набор в список, используя Список (набор)
Метод преобразования. Это имеет линейную сложность выполнения, и если вы называете его только один раз, он не изменяет общую сложность выполнения кодового фрагмента (он остается линейным в количестве заданных элементов).
Проблема: Что, если вы хотите сохранить информацию о заказе и до сих пор добавлять все элементы, которые еще не в списке?
Проблема с предыдущим подходом заключается в том, что путем преобразования списка на набор порядок списка теряется. В этом случае я советую вам сделать следующее: используйте две структуры данных, список и набор. Вы используете список, чтобы добавить новые элементы и сохранить информацию о заказе. Вы используете SET для проверки членства (постоянные, а не линейные сложности выполнения). Вот код:
lst = [1, 2, 3] s = set(lst) for element in range(10): if element not in s: s.add(element) lst.append(element) print(lst)
Результирующий список:
[1, 2, 3, 0, 4, 5, 6, 7, 8, 9]
Вы можете видеть, что результирующий список не содержит никаких дубликатов, но информация о заказе сохраняется. В то же время сложность выполнения кода является линейной, поскольку каждая итерация петли может быть завершена в постоянное время.
Компромисс в том, что вы должны поддерживать две структуры данных, которые приводит к двойниковым накладным расходам памяти. Это красиво демонстрирует общую обратную связь между памятью и временным расходом времени.
Список Python Extend () Вернуть новый список
Если вы используете lst.extend (ИТЕР)
Операция, вы добавляете элементы в ИТЕР
в существующий список lst
Отказ Но что, если вы хотите создать новый список, где были добавлены все элементы?
Ответ просто использовать Список конкатенации Операция lst + список (iTer)
который создает новый список каждый раз, когда он используется. Оригинальный список lst
не будет затронута операцией конкатенации списка.
Вот пример, который показывает, что продлить ()
Способ изменяет только существующий список:
>>> lst_1 = [1, 2, 3] >>> lst_2 = lst_1.extend([42, 99]) >>> lst_1 [1, 2, 3, 42, 99]
И вот пример, который показывает, как создать новый список, когда вы добавляете элементы 42 и 99 в список:
>>> lst_3 = [1, 2, 3] >>> lst_4 = lst_3 + [42, 99] >>> lst_3 [1, 2, 3]
Используя операцию конкатенации списка, вы можете создать новый список, а не добавлять элемент в существующий список.
Список Python расширяет () Сложность времени, память и эффективность
Сложность времени: продлить ()
Метод имеет линейный Сложность времени O (n) В количестве элементов N быть добавленным в список. Добавление одного элемента в список требуется только постоянное количество операций – независимо от размера списка.
Космическая сложность: продлить ()
Метод имеет линейную космическую сложность O (n) В количестве элементов N быть добавленным в список. Сама операция нуждается только в постоянном количестве байтов для вовлеченных временных переменных. Настройка памяти не зависит от размера списка.
Если вы заинтересованы в самых исполнительных способах добавления нескольких элементов в список, вы можете увидеть обширные тесты производительности в этом руководстве в блоге Finxter.
Python List Extend () при индексе
Если вы хотите вставить весь список в определенную позицию и создать новый список, если это рекомендую использовать нарезку Python. Ознакомьтесь с этим углубленным руководством блога, который покажет вам все, что вам нужно знать о нарезке.
Вот код, который показывает, как создать новый список после вставки списка в определенном положении:
>>> lst = [33, 44, 55] >>> lst[:2] + [99, 42] + lst[2:] [33, 44, 99, 42, 55]
Опять же, вы используете Список конкатенации Чтобы создать новый список с элементом 99, вставленных в положение 2. Обратите внимание, что операции нарезки lst [: 2]
и lst [2:]
Создайте свою собственную неглубокую копию списка.
Python List Extend () Безопасность потока
У вас есть несколько потоков, которые одновременно получают доступ к вашему списку? Затем вы должны быть уверены, что перечисленные операции (такие как Extend ()
) на самом деле резьба безопасна Отказ
Другими словами: вы можете позвонить в продлить ()
Операция в двух потоках в том же списке одновременно? (И вы можете быть уверены, что результат является значимым?)
Ответ да (если вы используете Mokef Cpython внедрение). Причина – Питона Блокировка глобального интерпретатора Это гарантирует, что поток, работающий в данный момент в этом коде, сначала завершит текущую базовую операцию Python, как определено реализацией CPYPHON. Только если оно завершится с помощью этой операции, сможет получить следующий поток для доступа к вычислительному ресурсу. Это обеспечивается сложной схемой блокировки в результате реализации CPYPHON.
Единственное, что вам нужно знать, состоит в том, что каждая основная операция в реализации CPYPHON является атомный Отказ Он выполнен полностью и сразу, прежде чем любой другой поток имеет возможность запустить на одном виртуальном двигателе. Поэтому нет условий расы. Примером для такого состояния гонки будет следующее: Первый поток считывает значение из списка, вторые потоки перезаписывают значение, и первая тема перезаписывает значение снова недействительным в операции второго потока.
Все операции Cpython являются потоковыми безопасными. Но если вы объединяете эти операции на функции более высокого уровня, это не в целом без резьбы, поскольку они состоят из многих (возможно, чередующихся) операций.
Куда пойти отсюда?
list.exdend (iTer)
Метод добавляет все элементы в ИТЕР
до конца Список
(в порядке их появления).
Вы узнали INS и ауты этого важного способа списка Python.
Если вы продолжаете бороться с теми основными командами Python, и вы чувствуете застрявшие в своем прогрессе обучения, у меня есть что-то для вас: Python One-listers (Amazon Link).
В книге я дам вам тщательный обзор темы критических компьютерных наук, таких как машинное обучение, регулярное выражение, наука о данных, Numpy и Python Basics – все в одной линейке кода Python!
Получите книгу от Amazon!
Официальная книга Описание: Python One-Listers покажет читателям, как выполнить полезные задачи с одной строкой кода Python. Следуя краткому переподготовку Python, книга охватывает важные продвинутые темы, такие как нарезка, понимание списка, вещание, функции лямбда, алгоритмы, регулярные выражения, нейронные сети, логистические регрессии и др .. Каждая из 50 секций книг вводит проблему для решения, проходит читателя через навыки, необходимые для решения этой проблемы, затем предоставляет краткое однонаправленное решение Python с подробным объяснением.
Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.
Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.
Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.