2013-09-24 10 views
8

Ho due elenchi e voglio unirli in un elenco di tuples. Voglio farlo con list comprehension, posso farlo funzionare usando map. ma sarebbe bello sapere come funzionerà la comprensione delle liste. codice quicome ottenere tuple dagli elenchi utilizzando la comprensione degli elenchi in python

>>> lst = [1,2,3,4,5] 
>>> lst2 = [6,7,8,9,10] 
>>> tup = map(None,lst,lst2) # works fine 
>>> tup 
[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)] 
>>> l3 = [lst, lst2] 
>>> l3 
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]] 
>>> zip(*l3) # works fine 
[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)] 

>>> [(i,j) for i in lst and for j in lst2] # does not work 
    File "<stdin>", line 1 
    [(i,j) for i in lst and for j in lst2] 
          ^
SyntaxError: invalid syntax 
>>> 

ho scritto commenti in cui opera e dove non è così. Come può un due for-loop essere accoppiato in list comprehension

risposta

13

Pensa alle list comprehensions come loop. Come puoi scrivere 2 loop non annidati?

È possibile farlo con un po 'di comprensione lista strana:

[(x, lst2[i]) for i, x in enumerate(lst)] 

o

[(lst[i], lst2[i]) for i in xrange(len(lst))] 

Ma in realtà, è meglio usare zip.

+1

bella soluzione, mi chiedevo se e come ottenere due cicli per la comprensione degli elenchi – eagertoLearn

5

La lista di comprensione modo è stupido, perché appena avvolge un elenco do-nothing comprensione intorno zip:

[(i,j) for i, j in zip(lst, lst2)] 

Basta usare zip, questo è quello che è per. Non ha senso costringersi a usare le comprensioni delle liste quando non realizzano nulla.

Modifica: Se la tua domanda è "come faccio a ottenere due cicli per una sola comprensione di lista", dovresti chiederlo. La risposta è "Non puoi ottenere due loop PARALLELI for in una sola comprensione di lista". Ogni volta che si inseriscono due clausole for in una comprensione di lista, esse verranno nidificate. Che, una lista di comprensione come questo:

[... for a in list1 for b in list2] 

Opere come due annidati for loop:

for a in list1: 
    for b in list2: 
     ... 

Non si può scrivere una lista di comprensione che fa questo:

for a in list1: 
    ... 
for b in list2: 
    ... 

. . . e non è necessario, perché hai la funzione zip per farlo.

(È possibile ordinare di esso falso usando una soluzione come @Roman Pekar di, ma che in realtà non fare due for cicli;. Lo fa solo uno e utilizza i valori da quella di raggiungere in altro elenco)

+0

Questo è equivalente all'utilizzo di zip (lst, lst2). Non c'è bisogno di [(i, j) per i, j in zip (lst, lst2)] >>> 'zip (lst, lst2) [(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)] >>> [(i, j) per i, j in zip (lst, lst2)] [(1, 6), (2, 7) , (3, 8), (4, 9), (5, 10)] 'Mi piacerebbe ottenere ciò senza usare' zip'if possibile – eagertoLearn

+0

@ user2708477 perché non vuoi usare zip? –

+0

@RomanPekar: come la mia domanda dice che voglio usare la comprensione delle liste, semplicemente perché voglio vedere come ottenere due cappi nella lista di comprensione, so come funziona zip ed è abbastanza semplice da usare con zip – eagertoLearn