Как объединить два списка в Python
Объединение списков — это процесс создания единого списка из нескольких меньших списков путем их последовательного соединения.
В Python есть много способов объединения списков. В частности, в этой статье мы рассмотрим, как объединить два списка в Python с помощью оператора плюс, оператора распаковки, оператора умножения, цикла for , itertools.chain() и extend() .
Во всех приведенных ниже фрагментах кода мы будем использовать следующие списки:
list_a = [1, 2, 3, 4] list_b = [5, 6, 7, 8]
Объединение списка операторов +
Самый простой и понятный способ объединить два списка в Python — это оператор плюс ( + ):
list_c = list_a + list_b print (list_c) # [1, 2, 3, 4, 5, 6, 7, 8]
Конкатенация списка с помощью распаковки
Этот метод позволяет объединить несколько списков. Это довольно новая функция, доступная только в Python 3.6+. Оператор распаковки, как следует из названия, распаковывает объект iterable на его элементы. Распаковка полезна, когда мы хотим сгенерировать множество аргументов из одного списка. Например:
def foo(a, b, c, d): return a + b + c + d # We want to use the arguments of the following list with the foo function. # However, foo doesn't take a list, it takes 4 numbers, which is why we need to # unpack the list. foo(*list_a) # This is the same as if we were to call foo(1,2,3,4)
Вкратце, мы используем конструктор списка ( [a,b..] ) и генерируем элементы нового списка по порядку, распаковывая несколько списков один за другим:
list_c = [*list_a, *list_b, *list_a] print (list_c) # [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4]
Объединение списков операторов умножения
Оператор multiply( * ) — это частный случай конкатенации списков в Python. Он используется для многократного повторения всего списка (поэтому он обозначается оператором умножения):
print(list_a * 2) # [1, 2, 3, 4, 1, 2, 3, 4]
Конкатенация списка в цикле for
В этом методе мы пройдемся по одному списку, добавляя каждый его элемент в другой список один за другим. Когда цикл закончится, у вас будет единый список со всеми желаемыми элементами:
for i in list_b: list_a.append(i) print(list_a) # [1, 2, 3, 4, 5, 6, 7, 8]
Объединение списков itertools.chain()
Этот метод работает с iterables . Он создает и возвращает итератор, который позже может быть использован для построения связанного списка (представьте его как стрелку, которая просто запоминает порядок элементов в результирующем списке):
# Если бы мы вызывали itertools.chain () вот так iterator = itertools.chain([1, 2], [3, 4]) # По сути, итератор - это стрелка, которая может дать нам следующий элемент в последовательности, # поэтому, если мы вызываем конструктор list() с указанной итерацией, он работает следующим образом: list(iterator)
# Итератор: следующий элемент в этом списке - 1 [1, 2], [3, 4] ^ # Итератор: следующий элемент в этом списке - 2 [1, 2], [3, 4] ^ # Итератор: следующий элемент в этом списке - 3 [1, 2], [3, 4] ^ # Итератор: следующий элемент в этом списке - 4 [1, 2], [3, 4] ^ # Итак, вызов list() выглядит примерно так: list([1,2,3,4]) # Имейте в виду, что это все псевдокод, Python не дает разработчику прямого контроля над итератором
Для этого метода вам нужно будет импортировать itertools :
import itertools list_c = list(itertools.chain(list_a, list_b)) print (list_c) # [1, 2, 3, 4, 5, 6, 7, 8]
Конкатенация списков с extension()
Это встроенная функция, которую можно использовать для расширения списка. Здесь мы расширяем первый список, добавляя в него элементы второго списка:
list_a.extend(list_b) print (list_a) # [1, 2, 3, 4, 5, 6, 7, 8]
Вывод
В этой статье мы рассмотрели пять способов объединения двух списков в Python — с помощью оператора плюс, оператора распаковки, оператора умножения, цикла for , itertools.chain() и extend() .
Мы уже писали об объединении в предыдущей статье «Конкатенация двух списков в Python». Эта статья являться более расширенным списком методов конкатенации.
6 способов слияния списка списков
Зашел тут у нас в офисе разговор как наиболее «красиво» и быстро склеить список списков в Питоне. Действительно как?
Даже такую казалось бы тривиальную задачу можно решить несколькими способами, существенно отличающимися по скорости и выразительности.
ВАРИАНТ1
Все знают, что элементы списка можно перебирать в цикле и, то что можно добавлять элементы в конец. Это приводит нас к первому варианту решения:
def listmerge1 ( lstlst ) :
all = [ ]
for lst in lstlst:
for el in lst:
all . append ( el )
return all
Мало того, что функция растянулось аж на 6 строк, так вдобавок она еще и не эффективная.
Попробуем её улучшить в обоих смыслах: скорости и красоты («pythonic way»).
ВАРИАНТ2
Тут мы вспоминаем, что в Питоне есть оператор «+» для строк и получаем:
def listmerge2 ( lstlst ) :
all = [ ]
for lst in lstlst:
all = all +lst
return all
Это самая медленная реализация. Прокол в том что в таком виде оператор «+» в каждом шаге создает новый объект-список, который на следующем шаге выкидывается и т.д.
ВАРИАНТ3
Исправить легко, надо заменить «+» на форму которая не создает новый список, а добавляет к старому. Это оператор «+ #ff7700″>def listmerge3 ( lstlst ) :
all = [ ]
for lst in lstlst:
all . extend ( lst )
return all
Все последующие решения я буду писать через лямбда-выражения, тк они состоят из одного выражения. Имя аргумента сокращено до ll, тк в коде в одну строку это не уменьшает читабельности.
# через анонимную функцию
listmerge= lambda ll : simple-statement
# эквивалентно
def listmerge ( ll ) :
return simple-statement
ВАРИАНТ4
Используя встроенные функции работы со списками, можно переписать вариант2 в стиле функционального программирования:
listmerge4a= lambda ll: reduce ( lambda a,b: a+b, ll, [ ] )
listmerge4b= lambda ll: sum ( ll, [ ] )
Он чуть чуть быстрее, но все еще тормозной по той же причине, что и его итеративный родственник. Здесь «lambda a,b: a+b» — анонимная функция двух аргументов, которая просто возвращает их сумму. Вариант B это просто шорткат, встроенный в Питон для удобста вычисления суммы элементов. Этот вариант самый короткий.
Лично меня не устраивает ни самый короткий (скорость), ни самый быстрый (красота). Попробуем найти компромисс.
ВАРИАНТ5
С помощью списковых выражений:
listmerge5= lambda ll: [ el for lst in ll for el in lst ]
Не сильно длиннее предыдущего, но радикально быстрее. Вариант несомненно красив, хотя вложенные списковые выражения не всегда понятны с первого взгляда.
ВАРИАНТ6
А что если попробовать переписать самый быстрый вариант в функцональном стиле? Легко:
listmerge6= lambda s: reduce ( lambda d,el: d. extend ( el ) or d, s, [ ] )
Заметьте «d.extend(el) or d» нам пришлось добавить оператор «or» тк метод extend возвращает None. По скорости он практически не уступает самому быстрому методу №3 (разница в скорости буквально единицы процентов и на мой взгляд не существенна).
По моему мнению «выбор редакции» стоит присудить варианту №6)
Для замеров скорости маленьких кусков кода в Питоне есть библиотека timeit. Вот пример кода, тестирующего варианты 3, 5 и 6 (самые быстрые и красивые).
variants = <
‘Reduce’ :
‘listmerge=lambda s: reduce(lambda d,el: d.extend(el) or d, s, [])’ ,
‘Iterate’ :
«»»
def listmerge(lstlst):
all=[]
for lst in lstlst:
all.extend(lst)
return all
«»» ,
‘Comprehension’ :
‘listmerge=lambda ll: [x for lst in ll for x in lst]’ ,
>
initstr= ‘lstlst=[range(i) for i in range(1000)] \n gc.enable()’
def test ( variants, initstr,n= 100 ) :
print «Test repeats n #483d8b»>» times \n INITSTR:» ,initstr, » \n \n »
for k,v in variants. iteritems ( ) :
print k, » — » , timeit . Timer ( «listmerge(lstlst)» , initstr+ » \n » +v ) . timeit ( n )
print
test ( variants,initstr, 100 )
Пример запуска теста времени. Видно что разница скорости между итеративным и функциональным вариантом исчезающе мала. Вариант на списковых выражениях заметно медленней (тут на погрешности не спишешь), но и размер наших списков огромен, для некритичных к скорости приложений он тоже имеет право на жизнь.
Test repeats n = 100 times
INITSTR: lstlst=[range(i) for i in range(1000)]
gc.enable()
Iterate — 1.56133103371
Reduce — 1.57647109032
Comprehension — 7.5749669075
ДОМАШНЕЕ ЗАДАНИЕ
Предлагаю решить/обсудить более сложную задачу развертывание вложенных списков в линейный.
Пример:
# Исходный список:
[ 7 , [ [ [ [ 2 ] ] ] , [ [ [ ] ] , [ 4 ] ] , [ 4 , 5 , [ 6 , 7 ] ] ] , 8 ]
# Результат:
[ 7 , 2 , 4 , 4 , 5 , 6 , 7 , 8 ]
UPD2:
ВАРИАНТ 6Б (от анонимного комментатора в ЖЖ)
5 методов как добавить и объединить два списка в Python
В этом разделе мы узнаем, как добавить и объединить два списка в Python. Но прежде чем перейти к теме, нам нужно понять термин «список» в Python.
Список Python используется для хранения нескольких элементов в переменной. Элементы в списке могут быть любыми упорядоченными, изменяемыми и позволяющими хранить повторяющиеся значения. Каждый элемент списка имеет соответствующее индексированное значение, где первый индекс списка начинается с , а индекс длины списка должен быть n-1. Каждый элемент списка разделен символом запятой(,) и заключен в квадратные скобки [].
L1 = ["Apple", 10, "NEW York"] # different data type elements L2 = [1, 2, 4, 5] # same data type elements
Здесь L1 и L2 – два списка, содержащие одинаковые и разные элементы данных в списке. Список L1 содержит элементы типа данных int и string, тогда как список L2 содержит только элементы типа данных int.
Рассмотрим программу для печати списка на Python.
List1 = ["Rose", "Lotus", 24, "Gold", "USA" ] # define the list # define the Department Dept2 list Dept2 = ["Web Designing", 40, 20] # define the HR_CS HR_CS = [58, "Ms Wiley"] List2 = [1, 2, 4, 5, 6] # integer list print(" Display the List1", List1) print(" Display the List2", List2) print(" Display the Department List", Dept2) print(" Display the CS Department ", HR_CS)
Display the List1 ['Rose', 'Lotus', 24, 'Gold', 'USA'] Display the List2 [1, 2, 4, 5, 6] Display the Department List ['Web Designing', 40, 20] Display the CS Department [58, 'Ms Wiley']
Давайте обсудим различные методы добавления двух списков в программе Python.
Метод 1. Добавление двух списков с помощью наивного метода
Это простой метод, который добавляет два списка в Python, используя методы цикла и добавления, и вставляет их в третий. Цикл for выполняет добавление обоих списков с одним и тем же номером индекса и непрерывно выполняет итерацию элементов до конца списка. После этого метод append вставляет добавленные элементы в третий список.
Давайте рассмотрим программу для добавления двух списков в Python с использованием метода Naive.
# initialize the Python lists lt1 = [5, 10, 15, 20, 25, 30] lt2 = [2, 4, 6, 8, 10, 12] # print the original list element print( " Python Original list 1: " + str(lt1)) print( "Python Original list 2: " + str(lt2)) # use naive method to add two list. res_lt = [] # declaration of the list for x in range(0, len(lt1)): res_lt.append( lt1[x] + lt2[x]) # Display the sum of two list in Python print( " Addition of the list lt1 and lt2 is: " + str(res_lt))
Python Original list 1: [5, 10, 15, 20, 25, 30] Python Original list 2: [2, 4, 6, 8, 10, 12] Addition of the list lt1 and lt2 is: [7, 14, 21, 28, 35, 42]
Метод 2: с помощью списка понимания
Это сокращенная техника наивного метода в Python. Техника понимания намного быстрее набирает и извлекает добавление двух списков. Следовательно, она используется в программировании на Python для выполнения этих типов задач.
Давайте рассмотрим программу для добавления двух списков в Python с использованием данного метода.
# initialize the Python lists lt1 = [2, 4, 6, 8, 10, 30] lt2 = [2, 4, 6, 8, 10, 12] # print the original list element print( " Python list 1 : " + str(lt1)) print( "Python list 2 : " + str(lt2)) # use list comprehension to add two lists. res_lt = [ lt1[x] + lt2[x] for x in range(len(lt1))] # Display the sum of two list in Python print( " Addition of the list lt1 and lt2 is: " + str(res_lt))
Python list 1 : [2, 4, 6, 8, 10, 30] Python list 2 : [2, 4, 6, 8, 10, 12] Addition of the list lt1 and lt2 is: [4, 8, 12, 16, 20, 42]
Метод 3. Добавление списков в Python, используя функцию map() с оператором add
В Python функция map() используется для добавления двух списков в обход переменных списка(lt1, lt2) и добавления в качестве параметров. Внутри функции map() добавленный параметр действует как дополнительный оператор для добавления списков и возвращает сумму.
Рассмотрим программу для добавления двух списков в Python с помощью функции map() с оператором добавления.
from operator import add # import the add operator from the operator module # initialize the lt1 and lt2 as the Python list' element lt1 = [4, 8, 12, 16, 20, 24] lt2 = [2, 4, 6, 8, 10, 12] # display the original items of the lists lt1 and lt2 print("Display the elements of List 1 " + str(lt1)) print("Display the elements of List 2 " + str(lt2)) # use map() function with add operator to add the elements of the lists lt1 and lt2 res_lt = list( map(add, lt1, lt2)) # pass the lt1, lt2 and add as the parameters # Display the sum of the two list print(" Sum of the list 1 and list 2 is : " + str(res_lt))
Display the elements of List 1 [4, 8, 12, 16, 20, 24] Display the elements of List 2 [2, 4, 6, 8, 10, 12] Sum of the list 1 and list 2 is: [6, 12, 18, 24, 30, 36]
Метод 4: принятие элемента от пользователя и объединение двух списков
В этой программе мы вводим элементы списка пользователя и вставляем их в список с помощью цикла For. После этого выполним сложение двух списков в программе Python.
Давайте рассмотрим программу, которая берет элемент списка, введенного пользователем, и добавляет его.
# Declaration of the lt1, lt 2 and lt3 lists lt1 = [] lt2 = [] lt3 = [] # Takes a numeric number from the user to define the total size of the list items = int(input(" Enter the total number of the list elements: ")) # Enter the list elements from the user one by one. print(" Enter the items into List 1 : ") for i in range(1, items + 1): num = int( input(" Enter the value of %d index is :" %i)) lt1.append(num) # insert the items into the list1 # Enter the list elements from the user one by one. print(" Enter the items into the List 2 : ") for i in range(1, items + 1): num = int( input(" Enter the value of %d index is :" %i)) lt2.append(num) # insert the items into the list2 for j in range(items): lt3.append(lt1[j] + lt2[j]) # add the list items of both list lt1 and lt2 into the lt3 print("\n Addition of the two lists is ", lt3)
Enter the total number of the list elements: 5 Enter the items into the List 1: Enter the value of 1 index is: 3 Enter the value of 2 index is: 6 Enter the value of 3 index is: 9 Enter the value of 4 index is: 12 Enter the value of 5 index is: 15 Enter the items into the List 2: Enter the value of 1 index is: 2 Enter the value of 2 index is: 4 Enter the value of 3 index is: 6 Enter the value of 4 index is: 8 Enter the value of 5 index is: 10 The addition of the two list is [5, 10, 15, 20, 25]
Метод 5: с помощью функций zip() и sum()
Функция sum() используется для добавления двух списков с использованием порядкового номера элементов списка, сгруппированных функцией zip(). Функция zip() используется в функции sum() для группировки элементов списка с помощью списков по индексу.
Давайте рассмотрим программу для добавления элементов списка с помощью функции zip и функции sum в Python.
# initializing of the lists lt1 and lt2 lt1 = [6, 12, 18, 3, 6, 9] lt2 = [4, 8, 12, 2, 4, 6] # display the original items of the lists lt1 and lt2 print("Display the elements of List 1 " + str(lt1)) print("Display the elements of List 2 " + str(lt2)) # use the zip() function and sum() function to group the lists add the lists' lt1 and lt2 with index #wise. result_lt = [sum(i) for i in zip(lt1, lt2 )] # Display the sum of the two list print(" Sum of the list 1 and list 2 is : " + str(result_lt))
Display the elements of List 1 [6, 12, 18, 3, 6, 9] Display the elements of List 2 [4, 8, 12, 2, 4, 6] Sum of the list 1 and list 2 is : [10, 20, 30, 5, 10, 15]
Как объединить два списка?
Нужно не нарушать порядок элементов списка, добавить только недостающие элементы в конец. Нашел только решение в библиотеке NumPy, но она мне не подходит, т.к. нужно загрузить решение задачи на сайт с автоматической системой тестов.
Отслеживать
25k 4 4 золотых знака 20 20 серебряных знаков 36 36 бронзовых знаков
задан 26 дек 2022 в 7:54
63 7 7 бронзовых знаков
Метки python-2.x и python-3.x вместе имеет смысл ставить только если вам нужно, чтобы код работал и на Python 2, и на Python 3. Вы уверены что поддержка Python 2 вам нужна?
26 дек 2022 в 8:04
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
Из первого массива сделайте set.
Если порядок недостающих элементов тоже важен, то пройдите по второму с проверкой — если текущего элемента нет в set — добавьте его к первому массиву
Отслеживать
ответ дан 26 дек 2022 в 8:00
51.5k 3 3 золотых знака 18 18 серебряных знаков 42 42 бронзовых знака
Можно сходу придумать кучу способов с разной степенью ручного вмешательства. Наиболее «автоматический» наверное будет такой:
c = list(dict.fromkeys(a + b))
Но работает данный способ только начиная с какой-то версии питона, когда сортировка элементов в словарях стала устойчивой. В более ранних версиях порядок элементов может нарушиться.
А типовой «ручной» способ — с помощью спискового сокращения выбрать те элементы второго списка, которых нет в первом, и добавить получившийся список к первому списку.