Python-Tupel zu diktieren


149

Gibt für das Tupel t = ((1, 'a'),(2, 'b')) dict(t)zurück{1: 'a', 2: 'b'}

Gibt es einen guten Weg, um zu bekommen {'a': 1, 'b': 2}(Schlüssel und Vals getauscht)?

Letztendlich möchte ich in der Lage sein, 1gegeben 'a'oder 2gegeben zurückzukehren 'b'. Vielleicht ist die Umwandlung in ein Diktat nicht der beste Weg.

Antworten:


277

Versuchen:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict((y, x) for x, y in t)
{'a': 1, 'b': 2}

8
+1 Schön!, Ich musste es mit Reißverschluss versuchen dict(zip(*zip(*t)[::-1])). Dies ist langsamer, hässlicher und verbraucht viel mehr Speicher. Wahrscheinlich 3x.
Kevpie

@kevpie Das Wunderbare an Python ist, dass es hundert Möglichkeiten gibt, auszudrücken, wie man etwas macht, jede genauso interessant wie die andere.
bjd2385

Großartig, wenn Sie ein Triple haben, können Sie es tun: dict((x, y) for x, y, z in t)oder dict((x, (y, z)) for x, y, z in t)den zweiten und dritten Wert als Tupel erhalten.
Guival

Sehr schnell, umfassend und einfach. Perfekte Antwort.
Gies0r

73

Eine etwas einfachere Methode:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict(map(reversed, t))
{'a': 1, 'b': 2}

1
Was macht das schneller?
Maazza

9
Die
Map-

1
Ich mag das, weil ich das reverseexplizit formuliert habe.
Frerich Raabe

4
@maazza: Im Allgemeinen deuten Leistungstests darauf hin, dass (zumindest in der C-Implementierung) mapschneller als ein Verständnis ist, wenn das zugeordnete Objekt eine andere integrierte Funktion (wie reversed) ist. In den meisten anderen Fällen ist das Gegenteil der Fall. Aber es ist besser zu profilieren als zu raten :)
Karl Knechtel

43

Noch prägnanter, wenn Sie mit Python 2.7 arbeiten:

>>> t = ((1,'a'),(2,'b'))
>>> {y:x for x,y in t}
{'a':1, 'b':2}

9
>>> dict([('hi','goodbye')])
{'hi': 'goodbye'}

Oder:

>>> [ dict([i]) for i in (('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14)) ]
[{'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}]

Ich sehe nicht, wie dies die Frage von OP beantwortet
Luca Amerio

4

Wenn für denselben Schlüssel mehrere Werte vorhanden sind, werden diese Werte mit dem folgenden Code an eine Liste angehängt, die ihrem Schlüssel entspricht.

d = dict()
for x,y in t:
    if(d.has_key(y)):
        d[y].append(x)
    else:
        d[y] = [x]

2

Hier sind einige Möglichkeiten, dies zu tun:

>>> t = ((1, 'a'), (2, 'b'))

>>> # using reversed function
>>> dict(reversed(i) for i in t)
{'a': 1, 'b': 2}

>>> # using slice operator
>>> dict(i[::-1] for i in t)
{'a': 1, 'b': 2}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.