2009-07-31 11 views
11

In particolare, ho due liste di stringhe che mi piacerebbe combinare in una stringa in cui ogni linea è i prossimi due stringhe dalle liste, separate da spazi:Come faccio a scorrere le tuple degli elementi di due o più liste in Python?

a = ['foo1', 'foo2', 'foo3'] 
b = ['bar1', 'bar2', 'bar3'] 

Voglio una funzione combine_to_lines() che sarebbero tornati:

"""foo1 bar1 
foo2 bar2 
foo3 bar3""" 

ammetto che ho già risolto questo problema, così ho intenzione di inviare la risposta. Ma forse qualcun altro ne ha uno migliore o vede un difetto nel mio.

Aggiornamento: ho semplificato il mio esempio sopra. Nel mio problema del mondo reale le linee erano formattate in un modo più complicato che richiedeva la decompressione delle tuple restituite da zip(). Ma complimenti per mhawke per arrivare alla soluzione più semplice per questo esempio.

risposta

14

Non è necessario decomprimere e repack le tuple restituite da zip:

'\n'.join(' '.join(x) for x in zip(a, b)) 
1

Stai chiedendo informazioni sulla funzione zip?

+1

Sì. Non riuscivo a ricordarlo, e una ricerca su Google ha richiesto un po 'di tempo per farmi girare la memoria. Forse questa domanda apparirà nelle ricerche future. –

+0

lo fa, e ha aiutato a fare jogging nella mia memoria. quindi grazie. – aeroNotAuto

+0

Un'altra domanda come risposta alla domanda? :) –

9

Il zip function "restituisce un elenco di tuple, in cui l'i-esima tupla contiene l'elemento i-esimo da ciascuna delle sequenze di argomenti o iterabili."

def combine_to_lines(list1, list2): 
    return '\n'.join([' '.join((a, b)) for a, b in zip(list1, list2)]) 
7
>>> a = ['foo1', 'foo2', 'foo3'] 
>>> b = ['bar1', 'bar2', 'bar3'] 
>>> for i in zip(a,b): 
... print ' '.join(i) 
... 
foo1 bar1 
foo2 bar2 
foo3 bar3 
0

Ecco un one-liner. Potrebbe fare x + ' ' + y se eri così inclinato, non so se sarebbe più lento o meno.

>>> a = ['foo1', 'foo2' , 'foo3'] 
>>> b = ['bar1', 'bar2', 'bar3'] 
>>> '\n'.join(' '.join([x,y]) for (x,y) in zip(a,b)) 
'foo1 bar1\nfoo2 bar2\nfoo3 bar3' 
>>> print _ 
foo1 bar1 
foo2 bar2 
foo3 bar3 
0
'\n'.join(((str(x) + ' ' + str(y)) for (x, y) in zip(a, b))) 
0

semplice come:

+0

dove sono le nuove linee? – mhawke

1

Mi rendo conto che questa è una domanda molto vecchio, ma è interessante notare che questo può essere visto come matrix transposition.

>>> import numpy 
>>> data = numpy.array([['foo1','foo2','foo3'],['bar1','bar2','bar3']]) 
>>> print(data) 
[['foo1' 'foo2' 'foo3'] 
['bar1' 'bar2' 'bar3']] 
>>> print(data.transpose()) 
[['foo1' 'bar1'] 
['foo2' 'bar2'] 
['foo3' 'bar3']] 

Se si ha a che fare con un set di dati di grandi dimensioni o più elenchi, questa potrebbe essere una soluzione più efficiente.

0

in Python 3.x:

'\n'.join(' '.join(x) for x in zip(a, b)) 

zip restituisce una lista di tuple. la chiusura lampo quando il più corto di aeb si ferma.

in Python 2.x:

se itertools.izip sarebbe fermarsi quando una delle liste corto di elementi, ma itertools.izip_longest si fermerà fino a liste non hanno più elementi

import itertools 
'\n'.join(' '.join(x) for x in itertools.izip(a, b)) 

'\n'.join(' '.join(x) for x in itertools.izip_longest(a, b)) 
+0

anche credito a mhawke per aver trovato la soluzione principale –

+0

Perché scrivi sopra "In Python 3.x"? Ho appena confermato che lo stop si interrompe quando il più breve di a o b si ferma su Python 2.7.5. –

+0

hai ragione! da quello che ho capito questa non era una funzionalità in python 2.x prima ed era di nuovo portata da 3.x ho ragione? se sì da quale versione sono stato aggiornato? –

Problemi correlati