webentwicklung-frage-antwort-db.com.de

Wie füge ich Listen zu einer Liste von Tupeln zusammen?

Was ist der Pythonic-Ansatz, um Folgendes zu erreichen?

# 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 von list_c Ist ein Tupel, dessen erstes Mitglied von list_a Und dessen zweites von list_b Stammt.

263
rubayeet

In Python 2:

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

In Python 3:

>>> list_a = [1, 2, 3, 4]
>>> list_b = [5, 6, 7, 8]
>>> list(Zip(list_a, list_b))
[(1, 5), (2, 6), (3, 7), (4, 8)]
376
YOU

In python 3.0 Zip wird ein Zip-Objekt zurückgegeben. Sie können eine Liste daraus abrufen, indem Sie list(Zip(a, b)) aufrufen.

138
Lodewijk

Sie können Karte Lambda verwenden

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

Dies funktioniert auch, wenn die Länge der Originallisten nicht übereinstimmt

11
Dark Knight

Sie suchen nach der eingebauten Funktion Zip .

8
Mizipzor

Ich bin mir nicht sicher, ob dies eine pythonische Methode ist oder nicht, aber dies scheint einfach zu sein, wenn beide Listen die gleiche Anzahl von Elementen haben:

list_a = [1, 2, 3, 4]

list_b = [5, 6, 7, 8]

list_c=[(list_a[i],list_b[i]) for i in range(0,len(list_a))]
6
Vipin

Ich weiß, dass dies eine alte Frage ist und bereits beantwortet wurde, aber aus irgendeinem Grund möchte ich immer noch diese alternative Lösung posten. Ich weiß, dass es einfach ist, herauszufinden, welche integrierte Funktion die "Magie" bewirkt, die Sie benötigen, aber es tut nicht weh, zu wissen, dass Sie es selbst tun können.

>>> 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')]
5
Kruger

Die Ausgabe, die Sie in der Problembeschreibung angezeigt haben, ist nicht das Tupel, sondern die Liste

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

überprüfe auf

type(list_c)

wenn Sie das Ergebnis als Tupel aus list_a und list_b erhalten möchten, tun Sie dies

Tuple(Zip(list_a,list_b)) 
5
cyborg

Eine Alternative ohne Zip:

list_c = [(p1, p2) for idx1, p1 in enumerate(list_a) for idx2, p2 in enumerate(list_b) if idx1==idx2]

Falls man nicht nur Tupel 1 mit 1, 2 mit 2 ... sondern alle möglichen Kombinationen der 2 Listen erhalten möchte, wäre das mit erledigt

list_d = [(p1, p2) for p1 in list_a for p2 in list_b]
1
J0ANMM