2009-07-31 7 views
11

Insbesondere, ich habe zwei Listen von Zeichenketten, die Ich mag würde in einen String zu kombinieren, wobei jede Zeile die nächsten zwei Saiten aus den Listen ist, durch Leerzeichen getrennt:Wie iteriere ich über die Tupel der Elemente von zwei oder mehr Listen in Python?

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

Ich möchte eine Funktion combine_to_lines() das würde zurückkehren:

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

ich gebe zu, ich habe dieses Problem bereits gelöst, so werde ich die Antwort senden. Aber vielleicht hat jemand anderes einen besseren oder sieht einen Fehler in meinem.

Update: Ich habe mein Beispiel oben zu stark vereinfacht. In meinem realen Problem wurden die Zeilen auf eine kompliziertere Art und Weise formatiert, die die entpackten Tupel von zip() erforderten. Aber ein großes Lob an mhawke für die einfachste Lösung für dieses Beispiel.

Antwort

14

Es ist nicht notwendig, um die zurückgegebenen Tupel von zip auspacken und umpacken:

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

Fragen Sie nach der zip Funktion?

+1

keine weiteren Elemente Ja. Ich konnte mich nicht daran erinnern, und eine Google-Suche brauchte ein wenig Zeit, um mein Gedächtnis zu verbessern. Vielleicht wird diese Frage bei zukünftigen Suchen auftauchen. –

+0

es tut, und geholfen, mein Gedächtnis zu joggen. also vielen Dank. – aeroNotAuto

+0

Eine andere Frage als Antwort auf die Frage? :) –

9

Die zip function "gibt eine Liste von Tupeln zurück, wobei das i-te Tupel das i-te Element aus jeder der Argumentsequenzen oder Iterablen enthält."

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

Hier ist ein Einzeiler. Konnte x + ' ' + y tun, wenn Sie so geneigt waren, nicht sicher, ob es langsamer wäre oder nicht.

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

einfach wie:

+0

Wo sind die neuen Zeilen? – mhawke

1

Ich weiß, dies ist eine sehr alte Frage, aber Es ist interessant zu bemerken, dass dies als matrix transposition angesehen werden kann.

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

Wenn Sie mit einer großen Datenmenge oder mehr Listen zu tun könnte dies eine effizientere Lösung sein.

0

In Python 3.x:

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

zip gibt eine Liste von Tupeln. Der Reißverschluss stoppt, wenn der kürzere von a oder b stoppt.

In Python 2.x:

wenn itertools.izip aufhören würde, wenn einer der Listen von Elementen läuft aber itertools.izip_longest wird aufhören, bis Listen

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

auch Kredit an mhawke für die Entwicklung der Hauptlösung –

+0

Warum schreiben Sie "In Python 3.x" oben? Ich habe gerade bestätigt, dass zip aufhört, wenn das kürzere von a oder b auf Python 2.7.5 aufhört. –

+0

Sie haben Recht! von dem, was ich verstehe, war dies kein Feature in Python 2.x vor und es wurde zurück portiert von 3.x bin ich richtig? Wenn ja, von welcher Version wurde ich aktualisiert? –

Verwandte Themen