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]
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]
[1,2,5] and [2,4,5,6]
? Czy chcesz, aby duplikaty zostały uwzględnione, wykluczone czy nieistotne?Odpowiedzi:
Możesz użyć
+
operatora, aby je połączyć:Wynik:
źródło
listone += listtwo
wynikilistone == [1, 2, 3, 4, 5, 6]
list3 = listone
listone+=listtwo
Czy zmieniła się również lista 3?Możliwe jest również utworzenie generatora, który po prostu iteruje elementy na obu listach za pomocą
itertools.chain()
. Umożliwia to łączenie list (lub dowolnej iterowalnej) razem w celu przetworzenia bez kopiowania elementów na nową listę:źródło
chain
jest wolniejszy (ale niewiele) dla dwóch list, ale jest najszybszym rozwiązaniem do łączenia wielu list (n >> 2).>= 3.5
Alternatywa dla Pythona :[*l1, *l2]
Wprowadzono kolejną alternatywę, której akceptacja
PEP 448
zasługuje na wzmiankę.PEP, zatytułowany Dodatkowe uogólnienia rozpakowywania , ogólnie zmniejszył pewne ograniczenia składniowe podczas używania
*
wyrażenia oznaczonego gwiazdką w Pythonie; dzięki niemu łączenie dwóch list (dotyczy dowolnej iterowalnej) można teraz również wykonać za pomocą:Ta funkcjonalność została zdefiniowana dla Pythona
3.5
i nie została przeniesiona do poprzednich wersji w3.x
rodzinie. W nieobsługiwanych wersjach pojawiSyntaxError
się a.Podobnie jak w przypadku innych podejść, to również tworzy płytką kopię elementów na odpowiednich listach.
Upside do tego podejścia jest to, że naprawdę nie trzeba list w celu jej wykonania, wszystko, co jest iterable zrobi. Jak stwierdzono w PEP:
A więc dodanie z
+
spowoduje podniesienieTypeError
niedopasowania typu:Następujące nie będą:
ponieważ najpierw rozpakuje zawartość iterable, a następnie po prostu utworzy plik
list
z zawartości.źródło
res = [*l1, *reversed(l2)]
. Ponieważreversed
zwraca iterator,res = l1 + reversed(l2)
zgłosiłby błąd.Możesz użyć zestawów, aby uzyskać scaloną listę unikalnych wartości
źródło
listone + [x for x in listtwo if x not in listone]
import collections; mergedlist = list(collections.OrderedDict.fromkeys(listone + listtwo))
zrobi to samo.Możesz także użyć tej
list.extend()
metody, aby dodaćlist
na końcu innego:Jeśli chcesz zachować nienaruszoną oryginalną listę, możesz utworzyć nowy
list
obiekt iextend
obie listy:źródło
Od wersji 3.7 są to najpopularniejsze metody stdlib do łączenia dwóch (lub więcej) list w pythonie.
Wydajność
Łączenie 2 list 1
Nie ma dużej różnicy między tymi metodami, ale ma to sens, biorąc pod uwagę, że wszystkie mają ten sam rząd złożoności (liniowy). Nie ma żadnego szczególnego powodu, aby preferować jeden od drugiego, z wyjątkiem stylu.
Łączenie N-list
Wykresy zostały wygenerowane przy użyciu modułu perfplot . Kod, w celach informacyjnych.
1.
iadd
(+=
) iextend
metody działają na miejscu, więc kopia musi być generowana za każdym razem przed testowaniem. Aby zachować uczciwość, wszystkie metody mają krok poprzedzający skopiowanie listy po lewej stronie, którą można zignorować.Komentarze do innych rozwiązań
NIE UŻYWAJ METODY DUNDERA
list.__add__
bezpośrednio w jakikolwiek sposób, kształcie lub formie. W rzeczywistości trzymaj się z daleka od metod dundera i używaj operatorów ioperator
funkcji tak, jak zostały zaprojektowane. Python ma staranną semantykę, która jest bardziej skomplikowana niż tylko bezpośrednie wywołanie dundera. Oto przykład . Podsumowując:a.__add__(b)
=> ZŁE;a + b
=> DOBRY.Niektóre odpowiedzi tutaj oferują
reduce(operator.add, [a, b])
konkatenację parami - to samo, cosum([a, b], [])
tylko bardziej nieporadne.Każda zastosowana metoda
set
spowoduje usunięcie duplikatów i utratę zamówienia. Używaj ostrożnie.for i in b: a.append(i)
jest bardziej pracochłonny i wolniejszy niża.extend(b)
, który jest wywołaniem jednofunkcyjnym i bardziej idiomatyczny.append
jest wolniejszy ze względu na semantykę, z jaką pamięć jest przydzielana i powiększana dla list. Zobacz tutaj podobną dyskusję.heapq.merge
będzie działać, ale jego przykładem użycia jest scalanie posortowanych list w czasie liniowym. Używanie go w każdej innej sytuacji jest anty-wzorem.yield
Wpisywanie elementów listy z funkcji jest akceptowalną metodą, alechain
robi to szybciej i lepiej (ma ścieżkę kodu w C, więc jest szybka).operator.add(a, b)
jest akceptowalnym funkcjonalnym odpowiednikiema + b
. Jego przypadki użycia są głównie do dynamicznej wysyłki metod. W przeciwnym razie, moim zdaniem , wolę ten,a + b
który jest krótszy i bardziej czytelny . YMMV.źródło
"There's not much difference between these methods but that makes sense given they all have the same order of complexity (linear). There's no particular reason to prefer one over the other except as a matter of style.
„Rozwiązań niewymienionych w mojej odpowiedzi lub krytykowanych w„ Komentarze ”Polecam nie używać.Jest to dość proste i myślę, że zostało nawet pokazane w samouczku :
źródło
To pytanie dotyczy bezpośrednio połączenia dwóch list. Jednak jest dość wysoki w wyszukiwaniu, nawet jeśli szukasz sposobu dołączenia do wielu list (w tym przypadku, gdy dołączasz do list zerowych).
Myślę, że najlepszą opcją jest użycie wyrażeń listowych:
Możesz także tworzyć generatory:
Stara odpowiedź
Rozważ to bardziej ogólne podejście:
Wyjdzie:
Uwaga, działa to również poprawnie, gdy
a
jest[]
lub[[1,2,3]]
.Można to jednak zrobić bardziej efektywnie za pomocą
itertools
:Jeśli nie potrzebujesz
list
, ale tylko iterowalnego, pomińlist()
.Aktualizacja
Alternatywa zaproponowana przez Patricka Collinsa w komentarzach może również działać dla Ciebie:
źródło
reduce
jest już dostępna,functools
więc najpierw musisz ją zaimportować.Możesz po prostu użyć operatora
+
lub+=
w następujący sposób:Lub:
Ponadto, jeśli chcesz, aby wartości na scalonej liście były unikalne, możesz:
źródło
list(dict.fromkeys(a + b))
Warto zauważyć, że
itertools.chain
funkcja przyjmuje zmienną liczbę argumentów:Jeśli wejściowy jest iterowalny (krotka, lista, generator itp.),
from_iterable
Można zastosować metodę klasy:źródło
W Pythonie 3.3+ możesz korzystać z zysków z :
Lub jeśli chcesz wesprzeć dowolną liczbę iteratorów:
źródło
itertools.chain
(co jest równoważne) zamiast definiować własną funkcję.Jeśli chcesz scalić dwie listy w posortowanej formie, możesz użyć
merge
funkcji zheapq
biblioteki.źródło
Jeśli nie możesz użyć operatora plus (
+
), możesz użyćoperator
importu:Alternatywnie możesz również użyć funkcji
__add__
dunder :źródło
+
jest poza stołem, użyjoperator.add
.Jako ogólniejszy sposób dla większej liczby list możesz umieścić je w liście i użyć funkcji
itertools.chain.from_iterable()
1, która na podstawie tej odpowiedzi jest najlepszym sposobem na spłaszczenie zagnieżdżonej listy:1. Zauważ, że
chain.from_iterable()
jest dostępny w Pythonie 2.6 i nowszych. W innych wersjach użyjchain(*l)
.źródło
Jeśli potrzebujesz scalić dwie uporządkowane listy ze skomplikowanymi regułami sortowania, być może będziesz musiał rzucić je samodzielnie, jak w poniższym kodzie (używając prostej reguły sortowania dla czytelności :-)).
źródło
heapq.merge
.Możesz użyć
append()
metody zdefiniowanej nalist
obiektach:źródło
Powyższy kod nie zachowuje kolejności, usuwa duplikaty z każdej listy (ale nie z listy konkatenowanej)
źródło
Jak już zauważyło wielu,
itertools.chain()
jest to droga, jeśli trzeba zastosować dokładnie to samo traktowanie do obu list. W moim przypadku miałem etykietę i flagę, które różniły się od jednej listy do drugiej, więc potrzebowałem czegoś nieco bardziej złożonego. Jak się okazuje, za kulisamiitertools.chain()
po prostu wykonuje następujące czynności:(patrz https://docs.python.org/2/library/itertools.html ), więc zaczerpnąłem inspirację z tego miejsca i napisałem coś w tym stylu:
Główne punkty do zrozumienia tutaj to, że listy są tylko specjalnym przypadkiem iteracji, które są obiektami jak każdy inny; i że
for ... in
pętle w pythonie mogą współpracować ze zmiennymi krotkowymi, więc łatwo jest zapętlić wiele zmiennych jednocześnie.źródło
Użyj prostego zrozumienia listy:
Ma wszystkie zalety najnowszego podejścia polegającego na stosowaniu dodatkowych uogólnień rozpakowywania - tzn. Można w ten sposób połączyć dowolną liczbę różnych iteracji (na przykład list, krotek, zakresów i generatorów) - i nie ogranicza się to do Pythona 3.5 lub nowszego .
źródło
Naprawdę zwięzłym sposobem na połączenie listy list jest
co daje nam
źródło
list.__add__
, użyjoperator.add
zamiast. Jest to bardziej niewygodny odpowiednik,sum(list_of_lists, [])
który jest równie zły. NIE UŻYWAJ!obj.__class__
iobj.__dict__
.W Pythonie za pomocą tego polecenia można połączyć dwie tablice zgodnych wymiarów
źródło
Są więc dwa proste sposoby.
+
: Tworzy nową listę na podstawie dostarczonych listPrzykład:
Przykład:
Widzimy zatem, że jedna z dwóch najpopularniejszych metod
extend
jest wydajna.źródło
chain.from_iterable
).Istnieje wiele sposobów konkatenetowania list w pythonie.
źródło
Wynik:
źródło
Jeśli chcesz nową listę, zachowując dwie stare listy:
źródło
źródło
Możesz postępować zgodnie z kodem
źródło