Domanda Come concatenare due liste in Python?


Come concatenare due elenchi in Python?

Esempio:

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

Risultato previsto:

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

1637
2017-11-12 07:04


origine


risposte:


Puoi usare il + operatore per combinarli:

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

mergedlist = listone + listtwo

Produzione:

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

2691
2017-11-12 07:07



È anche possibile creare un generatore che semplicemente itera sugli articoli in entrambi gli elenchi. Ciò consente di raggruppare gli elenchi (o qualsiasi altro iterabile) insieme per l'elaborazione senza copiare gli elementi in un nuovo elenco:

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

213
2017-11-12 20:01



È possibile utilizzare i set per ottenere un elenco unito di valori univoci

mergedlist = list(set(listone + listtwo))

154
2017-09-20 08:43



Puoi anche usare extend per aggiungere un list aggiungere la fine di un altro:

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

98
2018-02-25 15:13



Pitone >= 3.5 alternativa: [*l1, *l2]

Anche se questa è una vecchia risposta, è stata introdotta un'altra alternativa tramite l'accettazione di PEP 448 che merita di essere menzionato

Il PEP, intitolato Ulteriori generalizzazioni di disimballaggio, in genere riduceva alcune restrizioni sintattiche quando si utilizzava lo star * espressione in Python; con esso, ora puoi unire due liste (valide per qualsiasi iterabile) con:

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

Questa funzionalità è stato definito per Python 3.5 non è stato reinserito nelle versioni precedenti in 3.x famiglia. Nelle versioni non supportate a SyntaxError sta per essere sollevato.

Come con gli altri approcci, anche questo crea una copia superficiale degli elementi negli elenchi corrispondenti.


Il sottosopra con questo approccio è che non hai davvero bisogno di liste per poterlo eseguire, qualsiasi cosa sia iterabile. Come affermato nel PEP:

Questo è anche utile come un modo più leggibile di sommare iterabili in a   lista, come my_list + list(my_tuple) + list(my_range) che è ora   equivalente a solo [*my_list, *my_tuple, *my_range].

Quindi mentre aggiunta con + alzerebbe un TypeError a causa della mancata corrispondenza del tipo:

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

Quanto segue non:

res = [*l, *r]

perché per prima cosa disimballerà il contenuto degli iterables e quindi semplicemente creerà a list dai contenuti.


93
2017-11-12 07:07



Questo è abbastanza semplice, penso che sia stato anche mostrato in lezione:

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

57
2018-03-05 09:15



Potresti semplicemente usare il + o += operatore come segue:

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

c = a + b

O:

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

c += (a + b)

Inoltre, se vuoi che i valori della lista unita siano unici, puoi fare:

c = list(set(a + b))

33
2017-10-09 23:21



Questa domanda chiede direttamente di unire due liste. Comunque è abbastanza alto nella ricerca anche quando cerchi un modo per unire molte liste (incluso il caso in cui ti unisci a liste zero). Considera questo approccio più generico:

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

Produrrà:

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

Nota, anche questo funziona correttamente quando a è [] o [[1,2,3]].

Tuttavia, questo può essere fatto in modo più efficiente con itertools:

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

Se non hai bisogno di a list, ma solo un iterable, ometto list().

Aggiornare

L'alternativa suggerita da Patrick Collins nei commenti potrebbe funzionare anche per te:

sum(a, [])

29
2018-02-05 05:01



Vale la pena notare che il itertools.chain la funzione accetta un numero variabile di argomenti:

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

Se è un input iterabile (tupla, lista, generatore, ecc.), Il file from_iterable il metodo di classe può essere usato:

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



Con Python 3.3+ puoi usare rendimento da:

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]

Oppure, se vuoi supportare un numero arbitrario di iteratori:

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