Pytanie Jak połączyć dwie listy w Pythonie?


Jak połączyć dwie listy w Pythonie?

Przykład:

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

Spodziewany rezultat:

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

1643
2017-11-12 07:04


pochodzenie


co by było, gdyby był listone [3,2,1]? Czy wyjście się zmieni? - barkmadley
"scalić" jako "utworzyć jedną płytką kopię", "głębokie kopiowanie" lub "iterować z"? (@Clergyman, wcale nie jest tak trywialnie) - smci
Czy ta operacja nie jest wywołana? konkatinacja zamiast łączenie? Zawsze myślałem, że scalanie oznacza konkatinację + sortowanie. - Lenar Hoyt
Czy chcesz po prostu dodaćczy chcesz scal obie listy w posortowanej kolejności? Jakich wyników można się spodziewać po [1,3,6] i [2,4,5]? Czy możemy założyć, że obie podlisty są już posortowane (jak w twoim przykładzie)? - smci
@ LenarHoyt Poprawnie. Scalanie oznacza co najmniej dowolne uporządkowanie dowolne lub relacyjne. - Benjamin R


Odpowiedzi:


Możesz użyć + operator, aby je połączyć:

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

mergedlist = listone + listtwo

Wydajność:

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

2704
2017-11-12 07:07



czy tworzy to głęboką kopię listy i dołącza listtwo? - Daniel F
@Daniel utworzy nową listę z płytką kopią elementów na pierwszej liście, a następnie płytką kopią elementów z drugiej listy. Użyj copy.deepcopy, aby uzyskać głębokie kopie list. - Daniel G
kolejny pożyteczny szczegół tutaj: listone += listtwo prowadzi do listone == [1, 2, 3, 4, 5, 6] - rickcnagy
@ br1ckb0t zmieni to, na co wskazuje listono? Więc:list3 = listone  listone+=listtwo       Czy lista 3 również się zmieniła? - MikeH
zmienia listę 3. Jeśli jednak nie stanowi to problemu, łatwiej jest bardziej czytelnie dodać dwie listy zamiast tworzyć nową. - rickcnagy


Możliwe jest również utworzenie generatora, który po prostu iteruje po elementach na obu listach. Pozwala to na łączenie list (lub dowolnej iteracji) w celu przetworzenia bez kopiowania elementów do nowej listy:

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

215
2017-11-12 20:01



Jest to lepszy sposób, ponieważ działa również z tablicą numpy. - d.putto
czy to działa w ten sam sposób: mergedList = itertools.chain (listone, listtwo) dla elementu w mergedList: - zakdances
@ d.putto: dostęp do pojedynczych elementów jest bardzo powolny dla numpy tablic (każdy dostęp wymaga konwersji surowej pamięci z typem C na obiekt Pythona. np.dot() pracować na typach C bezpośrednio bez podróży w obie strony do Pythona, a zatem szybko). Możesz użyć merged = np.r_[a, b] aby uzyskać połączoną tablicę numpy. - jfs


Możesz użyć zestawów, aby uzyskać scaloną listę unikatowych wartości

mergedlist = list(set(listone + listtwo))

151
2017-09-20 08:43



to spowoduje utratę informacji o zamawianiu. - aaronasterling
To prawda, jednak usunie również duplikaty, jeśli to jest tym, czym jesteś zainteresowany. Dodanie listy wzdłuż tego nie zrobiłoby. - metasoarous
Lepszy niż listone + [x for x in listtwo if x not in listone] - Natim
Gdybym miał listę list, taką jak ta: [[0, 5], [1, 10], [0, 7], [3, 5]]  Jak byś je scalił, aby uniknąć duplikatów w kluczu (pierwsza wartość w każdej podliście), ale jeśli są duplikaty, kończy się sumą drugich wartości? Tak jak w przypadku: [[0, 12], [1, 10], [3, 5]]  Dzięki - Jose Salvatierra
+1 IMHO to jest poprawny sposób na "scalanie" list (union), podczas gdy "zatwierdzona" odpowiedź opisuje jak łączyć / dodawać listy (multiset) - alfasin


Możesz również użyć extend w celu dodania list dodaj koniec innego:

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

100
2018-02-25 15:13



Możesz użyć tylko listone.extend (listtwo), ale wkrótce zostanie wycofany - Sergey Ivanov
@SergeyIvanov nie, nie będzie. list.extend nigdzie się nie wybiera. - Jim Fasarakis Hilliard


Pyton >= 3.5 alternatywny: [*l1, *l2]

Mimo że jest to stara odpowiedź, inna alternatywa została wprowadzona poprzez akceptację PEP 448 zasługuje na wzmiankę.

PEP, zatytułowany Dodatkowe generowanie odpakowania, ogólnie zmniejszyło pewne ograniczenia składniowe podczas używania oznaczonego gwiazdką * wyrażenie w języku Python; wraz z nim, dołączenie dwóch list (dotyczy dowolnego iterowalnego) można teraz wykonać również za pomocą:

>>> 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]

Ta funkcja został zdefiniowany dla Pythona 3.5 nie zostało przeniesione do poprzednich wersji w 3.x rodzina. W nieobsługiwanych wersjach a SyntaxError zostanie podniesiony.

Podobnie jak w przypadku innych podejść, również to tworzy się jako płytka kopia elementów na odpowiednich listach.


The do góry do tego podejścia jest to, że naprawdę nie potrzebujesz list, aby go wykonać, wszystko co zrobi, zrobi. Jak stwierdzono w PEP:

Jest to również użyteczne jako bardziej czytelny sposób sumowania iterables na   lista, na przykład my_list + list(my_tuple) + list(my_range) który jest teraz   odpowiednik po prostu [*my_list, *my_tuple, *my_range].

Więc podczas dodawania z + podniosłoby a TypeError z powodu niedopasowania typu:

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

Następujące elementy nie będą:

res = [*l, *r]

ponieważ najpierw rozpakuje zawartość iterables, a następnie po prostu utworzy list z treści.


97
2017-11-12 07:07



to:lst = [1,2,3,*[4,5,6]] powiedziany Expected:] - Mahesha999
@ Mahesha999 nie może tego zweryfikować, działa zgodnie z oczekiwaniami. - Jim Fasarakis Hilliard


To jest całkiem proste, myślę, że zostało to nawet pokazane w seminarium:

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

57
2018-03-05 09:15



I to również działa kiedy listone i listtwo mieć inną liczbę elementów ;-) - albus_c


Możesz po prostu użyć + lub += operator w następujący sposób:

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

c = a + b

Lub:

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

c += (a + b)

Jeśli chcesz, aby wartości z scalonej listy były unikalne, możesz:

c = list(set(a + b))

33
2017-10-09 23:21





To pytanie bezpośrednio prosi o dołączenie do dwóch list. Jednak jest dość wysoko w wyszukiwaniu, nawet jeśli szukasz sposobu na dołączenie wielu list (w tym przypadku, gdy dołączasz do listy zerowej). Rozważ to bardziej ogólne podejście:

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

Wyjdzie:

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

Uwaga: działa to również poprawnie, gdy a jest [] lub [[1,2,3]].

Można to jednak zrobić wydajniej dzięki itertools:

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

Jeśli nie potrzebujesz list, ale tylko iterable, pominąć list().

Aktualizacja

Alternatywa zasugerowana przez Patricka Collinsa w komentarzach może również zadziałać dla Ciebie:

sum(a, [])

29
2018-02-05 05:01



sum(a,[]) działa tylko wtedy, gdy "a" jest listą list. - Procyclinsur
Python 3 note: reduce jest teraz w functools więc musisz najpierw zaimportować go. - Jim Fasarakis Hilliard


Warto zauważyć, że itertools.chain funkcja przyjmuje zmienną liczbę argumentów:

>>> 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']

Jeśli wartością wejściową jest iterable (tuple, list, generator itd.), To from_iterable można zastosować metodę klasy:

>>> 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