Питання Як об'єднати два списки в Python?


Як об'єднати два списки в Python?

Приклад:

listone = [1, 2, 3]
listtwo = [4, 5, 6]

Очікуваний результат:

>>> joinedlist
[1, 2, 3, 4, 5, 6]

1642
2017-11-12 07:04


походження


як щодо того, чи був цей список? [3,2,1]? Чи зміниться вихід? - barkmadley
"об'єднати" як "створити одну неглибоку копію", "глибоку копію" або "ітерацію з"? (@Clergyman, це зовсім не таке тривіальне) - smci
Чи не називається ця операція? concitination а не злиття? Я завжди вважав, що об'єднання означає concitination + сортування. - Lenar Hoyt
Ви просто хочете додати, або ти хочеш об'єднайте два списки у відсортованому порядку? Яку продукцію ви очікуєте для [1,3,6] та [2,4,5]? Чи можемо ми припустити, що обидва підриси вже відсортовані (як у вашому прикладі)? - smci
@LenarHoyt Correct Злиття передбачає щось якесь довільне або реляційне замовлення з мінімальним значенням. - Benjamin R


Відповіді:


Ви можете скористатись + Оператор об'єднує їх:

listone = [1,2,3]
listtwo = [4,5,6]

mergedlist = listone + listtwo

Вихід:

>>> mergedlist
[1,2,3,4,5,6]

2703
2017-11-12 07:07



чи створює це глибока копія списку і додає список? - Daniel F
@ Даніель він створить новий список з неглибокою копією елементів у першому списку, а потім мілкою копією елементів у другому списку. Використовуйте copy.deepcopy для отримання глибоких копій списків. - Daniel G
Ще одна корисна деталь тут: listone += listtwo призводить до listone == [1, 2, 3, 4, 5, 6] - rickcnagy
@ br1ckb0t змінить, що список вказує? Так:list3 = listone  listone+=listtwo       Чи змінився список 3? - MikeH
він змінює список3. Проте, якщо це не проблема, простіше і зручніше додавати два списки замість створення нового. - rickcnagy


Також можна створити генератор, який просто повторює елементи в обох списках. Це дозволяє вам об'єднувати списки (або будь-які ітерабельні) разом для обробки без копіювання елементів до нового списку:

import itertools
for item in itertools.chain(listone, listtwo):
   # do something with each list item

215
2017-11-12 20:01



Це кращий спосіб, оскільки він також працює з масивом numpy. - d.putto
чи буде це працювати так само: mergedList = itertools.chain (listone, listtwo) для елемента в mergedList: - zakdances
@ d.putto: доступ до окремих елементів дуже повільний для масивів numpy (кожен доступ вимагає перетворення вихідної пам'яті з C-типу в об'єкт Python. Векторизовані операції, такі як np.dot() працюйте над типами C безпосередньо без кругової подорожі до Python і, отже, швидко). Ви могли б використовувати merged = np.r_[a, b] щоб отримати об'єднаний масив numberpy. - jfs


Ви можете використовувати набори для отримання об'єднаного списку унікальних значень

mergedlist = list(set(listone + listtwo))

152
2017-09-20 08:43



це буде втрачати інформацію про замовлення. - aaronasterling
Правда, однак, він також видаляє дублікати, якщо це те, що вас зацікавив. Крім того, додавання списку не буде таким. - metasoarous
Краще ніж listone + [x for x in listtwo if x not in listone] - Natim
Якби я мав список списків, таких як цей: [[0, 5], [1, 10], [0, 7], [3, 5]]  Як ви об'єднаєте їх, щоб уникнути дублікатів у ключ (перше значення в кожному підсписок), але якщо вони є дублікатами, в кінцевому підсумку вони складають суму другого значення? Подібно до цього: [[0, 12], [1, 10], [3, 5]]  Дякую - Jose Salvatierra
+1 IMHO це правильний спосіб переміщення (об'єднання) списків, тоді як "схвалена" відповідь описує, як об'єднати / додати списки (мультисет) - alfasin


Ви могли б також використовувати extend щоб додати a list додайте кінець іншого:

listone = [1,2,3]
listtwo = [4,5,6]
mergedlist = []
mergedlist.extend(listone)
mergedlist.extend(listtwo)

100
2018-02-25 15:13



Ви можете скористатись лише списком списку (список), але воно незабаром буде застарілим - Sergey Ivanov
@Сергея Іванова нічого не буде. list.extend нікуди не йде. - Jim Fasarakis Hilliard


Python >= 3.5 альтернатива: [*l1, *l2]

Незважаючи на те, що це стара відповідь, інша альтернатива була введена через прийняття PEP 448 що заслуговує на увагу.

PEP, з назвою Додаткові узагальнення розпакування, як правило, зменшувало деякі синтаксичні обмеження при використанні зірки * вираз в Python; разом з цим, приєднуючись до двох списків (застосовується до будь-яких ітерабелів) тепер можна також виконати за допомогою:

>>> l1 = [1, 2, 3]
>>> l2 = [4, 5, 6]

#unpack both iterables in a list literal
>>> joinedList = [*l1, *l2]
>>> print(joinedList)
[1, 2, 3, 4, 5, 6]

Ця функціональність був визначений для Python 3.5 вона не була попередньо вернута до попередніх версій в 3.x сім'я У непідтримуваних версіях a SyntaxError збирається піднятися.

Як і в інших підходах, це теж створюється як дрібна копія елементів у відповідних списках.


The вгору до такого підходу є те, що вам дійсно не потрібні списки для його виконання, все, що буде ітерабельно, зробить. Як зазначено в ПЕП:

Це також корисно як більш зрозумілий спосіб підсумовування ієрбелів в a   список, наприклад my_list + list(my_tuple) + list(my_range) який зараз   еквівалентно просто [*my_list, *my_tuple, *my_range].

Отже, при додаванні з + підніме а TypeError через невідповідність типу:

l = [1, 2, 3]
r = range(4, 7)
res = l + r

Нижче не буде:

res = [*l, *r]

тому що спочатку розпакує вміст iterables, а потім просто створить a list з вмісту.


96
2017-11-12 07:07



це:lst = [1,2,3,*[4,5,6]] сказав Expected:] - Mahesha999
@ Mahesha999, здається, не підтверджують, що він працює як очікується для мене. - Jim Fasarakis Hilliard


Це досить просто, я думаю, це було навіть показано в підручник:

>>> listone = [1,2,3]
>>> listtwo = [4,5,6]
>>>
>>> listone + listtwo
[1, 2, 3, 4, 5, 6]

57
2018-03-05 09:15



І це також працює, коли listone і listtwo мати іншу кількість елементів ;-) - albus_c


Ви можете просто використовувати + або += оператор наступним чином:

a = [1, 2, 3]
b = [4, 5, 6]

c = a + b

Або:

c = []
a = [1, 2, 3]
b = [4, 5, 6]

c += (a + b)

Крім того, якщо ви хочете, щоб значення в об'єднаному списку були унікальними, ви можете зробити це:

c = list(set(a + b))

33
2017-10-09 23:21





Це питання прямо запитує про приєднання двох списків. Однак він досить високий в пошуку, навіть якщо ви шукаєте спосіб об'єднання багатьох списків (у тому числі і при приєднанні до нульових списків). Розглянемо цей більш загальний підхід:

a = [[1,2,3], [4,5,6], [7,8,9]]
reduce(lambda c, x: c + x, a, [])

Вийде:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

Зауважте, що це також працює коректно, коли a є [] або [[1,2,3]].

Однак це можна зробити більш ефективно itertools:

a = [[1,2,3], [4,5,6], [7,8,9]]
list(itertools.chain(*a))

Якщо вам не потрібна list, але просто ітерабельний, опустити list().

Оновити

Альтернатива, запропонована Патріком Колінзом в коментарях, може також допомогти вам:

sum(a, [])

29
2018-02-05 05:01



sum(a,[]) працює тільки тоді, коли "a" - це список списків. - Procyclinsur
Примітка Python 3: reduce зараз в functools тому вам спочатку потрібно імпортувати його. - Jim Fasarakis Hilliard


Варто відзначити, що itertools.chain Функція приймає змінну кількість аргументів:

>>> l1 = ['a']; l2 = ['b', 'c']; l3 = ['d', 'e', 'f']
>>> [i for i in itertools.chain(l1, l2)]
['a', 'b', 'c']
>>> [i for i in itertools.chain(l1, l2, l3)]
['a', 'b', 'c', 'd', 'e', 'f']

Якщо ітерабельним (кортеж, список, генератор і т. Д.) Є вхідним, то from_iterable Клас метод може бути використаний:

>>> il = [['a'], ['b', 'c'], ['d', 'e', 'f']]
>>> [i for i in itertools.chain.from_iterable(il)]
['a', 'b', 'c', 'd', 'e', 'f']

20
2017-07-21 00:53





З Python 3.3+ ви можете використовувати виходити з:

listone = [1,2,3]
listtwo = [4,5,6]

def merge(l1, l2):
    yield from l1
    yield from l2

>>> list(merge(listone, listtwo))
[1, 2, 3, 4, 5, 6]

Або, якщо ви хочете підтримати довільну кількість ітераторів:

def merge(*iters):
    for it in iters:
        yield from it

>>> list(merge(listone, listtwo, 'abcd', [20, 21, 22]))
[1, 2, 3, 4, 5, 6, 'a', 'b', 'c', 'd', 20, 21, 22]

19
2017-07-07 13:30