tra - unire due liste python




Come concatenare due liste in Python? (19)

È 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

Come concatenare due elenchi in Python?

Esempio:

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

Risultato previsto:

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

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

mergedlist = list(set(listone + listtwo))

È possibile utilizzare la funzione extends

listone.extends(listtwo)

È un modo davvero conciso per combinare un elenco di elenchi

list_of_lists = [[1,2,3], [4,5,6], [7,8,9]]
reduce(list.__add__, list_of_lists)

che ci dà

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

Come un modo più generale per più elenchi, è possibile inserirli in un elenco e utilizzare itertools.chain.from_iterable() 1 funzione basata su THIS answer è il modo migliore per itertools.chain.from_iterable() un elenco annidato:

>>> l=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> import itertools
>>> list(itertools.chain.from_iterable(l))
[1, 2, 3, 4, 5, 6, 7, 8, 9] 

1. Si noti che chain.from_iterable() è disponibile in python => 2.6.In altre versioni usa la chain(*l)


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]

Potresti semplicemente usare l'operatore + o += 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))

Puoi anche utilizzare l' 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)

Puoi usare l'operatore + per combinarli:

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

mergedlist = listone + listtwo

Produzione:

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

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

Penso che l'opzione migliore sia usare le list comprehensions:

>>> a = [[1,2,3], [4,5,6], [7,8,9]]
>>> [x for xs in a for x in xs]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

Puoi anche creare generatori:

>>> map(str, (x for xs in a for x in xs))
['1', '2', '3', '4', '5', '6', '7', '8', '9']

Vecchia risposta

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, questo funziona anche 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 una list , ma solo di una list() iterabile, ometti list() .

Aggiornare

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

sum(a, [])

Quindi ci sono due semplici modi.

  1. Usando + : Crea una nuova lista dagli elenchi forniti

Esempio :

In [1]: a = [1, 2, 3]

In [2]: b = [4, 5, 6]

In [3]: a + b
Out[3]: [1, 2, 3, 4, 5, 6]

In [4]: %timeit a + b
10000000 loops, best of 3: 126 ns per loop
  1. Uso dell'estensione : aggiunge il nuovo elenco all'elenco esistente. Ciò significa che non crea una lista separata.

Esempio :

In [1]: a = [1, 2, 3]

In [2]: b = [4, 5, 6]

In [3]: %timeit a.extend(b)
10000000 loops, best of 3: 91.1 ns per loop

Così vediamo che su due dei metodi più popolari, l' extend è efficiente.


Se hai bisogno di unire due liste ordinate con regole di ordinamento complicate, potresti doverla rotolare tu stesso come nel seguente codice (usando una semplice regola di ordinamento per la leggibilità :-)).

list1 = [1,2,5]
list2 = [2,3,4]
newlist = []

while list1 and list2:
    if list1[0] == list2[0]:
        newlist.append(list1.pop(0))
        list2.pop(0)
    elif list1[0] < list2[0]:
        newlist.append(list1.pop(0))
    else:
        newlist.append(list2.pop(0))

if list1:
    newlist.extend(list1)
if list2:
    newlist.extend(list2)

assert(newlist == [1, 2, 3, 4, 5])

Se si desidera una nuova lista mantenendo le due vecchie liste:

def concatenate_list(listOne, listTwo):
    joinedList = []
    for i in listOne:
        joinedList.append(i)
    for j in listTwo:
        joinedList.append(j)

    sorted(joinedList)

    return joinedList

Se si desidera unire i due elenchi in forma ordinata, è possibile utilizzare la funzione di unione dalla libreria heapq.

from heapq import merge

a = [1,2,4]
b = [2,4,6,7]

print list(merge(a,b))

Unendo due elenchi in Python:

>>> a = [1, 2, 3, 4]
>>> b = [1, 4, 6, 7]
>>> c = a + b
>>> c
[1, 2, 3, 4, 1, 4, 6, 7]

Se non vuoi alcuna duplicazione:

>>> a = [1, 2, 3, 4, 5, 6]
>>> b = [5, 6, 7, 8]
>>> c = list(set(a + b))
>>> c
[1, 2, 3, 4, 5, 6, 7, 8]

Vale la pena notare che la funzione itertools.chain 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 (tuple, list, generator, ecc.), È possibile utilizzare il metodo della classe from_iterable :

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

a = [1,2,3,4,5,6]
b = [7,8,9,10]
c = a.extend(b)

stampa (c) dà

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

import itertools

A = list(zip([1,3,5,7,9],[2,4,6,8,10]))
B = [1,3,5,7,9]+[2,4,6,8,10]
C = list(set([1,3,5,7,9] + [2,4,6,8,10]))

D = [1,3,5,7,9]
D.append([2,4,6,8,10])

E = [1,3,5,7,9]
E.extend([2,4,6,8,10])

F = []
for a in itertools.chain([1,3,5,7,9], [2,4,6,8,10]):
    F.append(a)


print ("A: " + str(A))
print ("B: " + str(B))
print ("C: " + str(C))
print ("D: " + str(D))
print ("E: " + str(E))
print ("F: " + str(F))

Produzione:

A: [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
B: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
C: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
D: [1, 3, 5, 7, 9, [2, 4, 6, 8, 10]]
E: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
F: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]

lst1 = [1,2]

lst2 = [3,4]

def list_combinationer(Bushisms, are_funny):

    for item in lst1:
        lst2.append(item)
        lst1n2 = sorted(lst2)
        print lst1n2

list_combinationer(lst1, lst2)

[1,2,3,4]




list