2010-03-09 6 views
181

Was ist der Pythonic Ansatz, um das Folgende zu erreichen?Wie verschmelzen Listen zu einer Liste von Tupeln?

# Original lists: 

list_a = [1, 2, 3, 4] 
list_b = [5, 6, 7, 8] 

# List of tuples from 'list_a' and 'list_b': 

list_c = [(1,5), (2,6), (3,7), (4,8)] 

Jedes Mitglied list_c ist ein Tupel, dessen erste Element aus list_a und die zweite ist aus list_b.

Antwort

258
>>> list_a = [1, 2, 3, 4] 
>>> list_b = [5, 6, 7, 8] 
>>> zip(list_a, list_b) 
[(1, 5), (2, 6), (3, 7), (4, 8)] 
+56

Sie wissen müssen, dass die Zip-Funktion am Ende der kürzesten Liste stoppt, was nicht immer sein kann, was Sie wollen . Das 'itertools'-Modul definiert eine' zip_longest() '-Methode, die am Ende der längsten Liste anhält und fehlende Werte mit etwas füllt, das Sie als Parameter angeben. –

+5

@Adrien: Prost für Ihren anwendbaren Kommentar. Für Python 2.x, 's/zip_longest()/izip_longest()'. In Python 3.x in 'zip_longest()' umbenannt. – bernie

+0

könnte ich [(1,5), (1,6), (1,7), (1,8), (2,5), (2,6) usw. mit dem zip-Befehl erstellen? –

87

In Python 3.0 gibt zip ein Zip-Objekt zurück. Sie können eine Liste abrufen, indem Sie list(zip(a, b)) aufrufen.

3

Ich weiß, das ist eine alte Frage und wurde bereits beantwortet, aber aus irgendeinem Grund möchte ich diese alternative Lösung noch posten. Ich weiß, dass es einfach ist herauszufinden, welche eingebaute Funktion die "Magie" benötigt, aber es tut nicht weh zu wissen, dass du es selbst machen kannst.

>>> list_1 = ['Ace', 'King'] 
>>> list_2 = ['Spades', 'Clubs', 'Diamonds'] 
>>> deck = [] 
>>> for i in range(max((len(list_1),len(list_2)))): 
     while True: 
      try: 
       card = (list_1[i],list_2[i]) 
      except IndexError: 
       if len(list_1)>len(list_2): 
        list_2.append('') 
        card = (list_1[i],list_2[i]) 
       elif len(list_1)<len(list_2): 
        list_1.append('') 
        card = (list_1[i], list_2[i]) 
       continue 
      deck.append(card) 
      break 
>>> 
>>> #and the result should be: 
>>> print deck 
>>> [('Ace', 'Spades'), ('King', 'Clubs'), ('', 'Diamonds')] 
+2

Das Ändern einer der Eingabelisten (wenn sie sich in der Länge unterscheiden) ist kein schöner Nebeneffekt. Auch die beiden Zuordnungen zu 'card' im' if-elif' werden nicht benötigt, deshalb haben Sie das 'continue'. (Ohne das 'continue' müßten Sie die Listen nicht ändern. Beide zuvor erwähnten Zuweisungen sollten dann beibehalten werden und zu 'card = (list_1 [i],' ')' und 'card = (' ', list_2 [1]) 'bzw..) –

6

Sie

Karte Lambda können
a = [2,3,4] 
b = [5,6,7] 
c = map(lambda x,y:(x,y),a,b) 

Dies funktioniert auch, wenn der Originallisten Längen entsprechen nicht

+1

Warum ein Lambda? 'map (None, a, b)' –

+0

Keines wird einen Fehler ausgeben, da es nicht aufrufbar ist. –

+0

Haben Sie es versucht? –

4

Die Ausgabe, die Sie in Problemstellung zeigte nicht die Tupel aber Liste

list_c = [(1,5), (2,6), (3,7), (4,8)] 

Check für

type(list_c) 

bedenkt, wollen Sie das Ergebnis als Tupel aus list_a und list_b, tun

tuple(zip(list_a,list_b)) 
+0

Aus meiner Sicht scheint es, was ich suche und für die beiden (Liste und Tupel) gut funktionieren. Denn wenn Sie ** print ** verwenden, sehen Sie den richtigen Wert (wie von @cyborg und @Lodewijk erwartet und erwähnt) und nichts, was mit dem ** Objekt ** zusammenhängt, wie zum Beispiel: '' or ''.Zumindest die Lösung von ** map ** und ** zip ** (alleine) scheint für mich unvollständig (oder zu kompliziert) zu sein. –

Verwandte Themen