Hoe kan ik de aaneenschakeling van twee lijsten in Python krijgen zonder een van beide te wijzigen?

In Python is de enige manier om twee lijsten samen te voegen list.extend, waarmee de eerste lijst wordt gewijzigd. Is er een aaneenschakelingsfunctie die het resultaat retourneert zonder de argumenten te wijzigen?


Antwoord 1, autoriteit 100%

Ja: list1 + list2. Dit geeft een nieuwe lijst die de aaneenschakeling is van list1en list2.


Antwoord 2, autoriteit 15%

De eenvoudigste methode is om de operator +te gebruiken, die de aaneenschakeling van de lijsten retourneert:

concat = first_list + second_list

Een nadeel van deze methode is dat er nu twee keer zoveel geheugen wordt gebruikt . Voor zeer grote lijsten, afhankelijk van hoe je het gaat gebruiken als het eenmaal is gemaakt, itertools.chainis misschien wel de beste keuze:

>>> import itertools
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = itertools.chain(a, b)

Hierdoor ontstaat een generator voor de items in de gecombineerde lijst, wat het voordeel heeft dat er geen nieuwe lijst hoeft te worden aangemaakt, maar u kunt toch cgebruiken alsof het de aaneenschakeling van de twee is lijsten:

>>> for i in c:
...     print i
1
2
3
4
5
6

Als uw lijsten groot zijn en efficiëntie een probleem is, dan zijn deze en andere methoden uit de itertools-module erg handig om te weten.

Merk op dat dit voorbeeld de items in cgebruikt, dus u zou het opnieuw moeten realiseren voordat u het kunt hergebruiken. Natuurlijk kunt u gewoon list(c)gebruiken om de volledige lijst te maken, maar die een nieuwe lijst in het geheugen maakt.


Antwoord 3, Autoriteit 10%

concatenated_list = list_1 + list_2


Antwoord 4, Autoriteit 9%

U kunt ook sumgebruiken, als u het een startargument:

>>> list1, list2, list3 = [1,2,3], ['a','b','c'], [7,8,9]
>>> all_lists = sum([list1, list2, list3], [])
>>> all_lists
[1, 2, 3, 'a', 'b', 'c', 7, 8, 9]

Dit werkt in het algemeen voor alles wat de +operator heeft:

>>> sum([(1,2), (1,), ()], ())
(1, 2, 1)
>>> sum([Counter('123'), Counter('234'), Counter('345')], Counter())
Counter({'1':1, '2':2, '3':3, '4':2, '5':1})
>>> sum([True, True, False], False)
2

Met de opmerkelijke uitzondering van strings:

>>> sum(['123', '345', '567'], '')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]

Antwoord 5, Autoriteit 4%

U kunt altijd een nieuwe lijst maken die een resultaat is van het toevoegen van twee lijsten.

>>> k = [1,2,3] + [4,7,9]
>>> k
[1, 2, 3, 4, 7, 9]

Lijsten zijn mutable sequenties, dus ik denk dat het logisch is om de originele lijsten te wijzigen door uit te breiden of toe te voegen.


Antwoord 6, Autoriteit 2%

En als u meer dan twee lijsten moet samenvoegen:

import operator
from functools import reduce  # For Python 3
list1, list2, list3 = [1,2,3], ['a','b','c'], [7,8,9]
reduce(operator.add, [list1, list2, list3])
# or with an existing list
all_lists = [list1, list2, list3]
reduce(operator.add, all_lists)

Het bespaart je eigenlijk geen tijd (tussenliggende lijsten worden nog steeds gemaakt), maar leuk als je een variabel aantal lijsten hebt om af te vlakken, bijvoorbeeld *args.


Antwoord 7

Alleen om je te laten weten:

Wanneer u list1 + list2schrijft, roept u de __add__methode van list1aan, die een nieuwe lijst retourneert. op deze manier kun je ook omgaan met myobject + list1door de methode __add__toe te voegen aan je persoonlijke klas.

Other episodes