Wie kann ich ein Wörterbuch in eine Liste von Tupeln konvertieren?

218

Wenn ich ein Wörterbuch habe wie:

{ 'a': 1, 'b': 2, 'c': 3 }

Wie kann ich es in dieses konvertieren?

[ ('a', 1), ('b', 2), ('c', 3) ]

Und wie kann ich es dazu konvertieren?

[ (1, 'a'), (2, 'b'), (3, 'c') ]
Mike
quelle
7
[tuple(reversed(x)) for x in d.items()]
Garej
1
@garej: Da xbereits ein tuplein Ihrem Code enthalten ist (es liegt in der Natur items, eine Iterable von tuples zu erstellen ), wäre es einfacher / schneller, dies einfach zu tun [x[::-1] for x in d.items()]. Das Umkehr-Slice erstellt direkt eine Umkehrung tupleder richtigen Größe, anstatt den tupleKonstruktor iterativ (mit Gesamtzuordnung und Größenänderung am Ende) a tupleaus einem reversedIterator füllen zu lassen .
ShadowRanger
@ ShadowRanger, du hast recht. Ich wollte nur ausdrücklich darauf hinweisen, dass k, vin solchen Fällen nicht immer ein Muster erforderlich ist.
Garej
Hinweis: hinzugefügt compatibilityTag wegen py2.x // py3.x Unterschiede
dreftymac

Antworten:

360
>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> d.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]

Es ist nicht in der von Ihnen gewünschten Reihenfolge, aber Diktate haben sowieso keine bestimmte Reihenfolge. 1 Sortieren oder organisieren Sie es nach Bedarf.

Siehe: items () , iteritems ()


In Python 3.x würden Sie nicht verwenden iteritems(was nicht mehr existiert), sondern verwenden items, was jetzt eine "Ansicht" in die Wörterbuchelemente zurückgibt. Weitere Informationen finden Sie im Dokument "Neue Funktionen für Python 3.0" und in der neuen Dokumentation zu Ansichten .

1: In Python 3.7 wurde die Beibehaltung der Einfügereihenfolge für Diktate hinzugefügt

Devin Jeanpierre
quelle
7
items () gibt eine dict_keys-Ansicht in python3 zurück. Schließen Sie diesen Aufruf mit einer Besetzung in eine Liste "list ()" ab. Siehe @ SilentGhost Antwort
Erich
54

da es sonst niemand getan hat, werde ich py3k-Versionen hinzufügen:

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> list(d.items())
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.items()]
[(1, 'a'), (3, 'c'), (2, 'b')]
SilentGhost
quelle
18

Sie können Listenverständnisse verwenden.

[(k,v) for k,v in a.iteritems()] 

werde dich bekommen [ ('a', 1), ('b', 2), ('c', 3) ]und

[(v,k) for k,v in a.iteritems()] 

das andere Beispiel.

Lesen Sie mehr über Listenverständnisse, wenn Sie möchten. Es ist sehr interessant, was Sie damit machen können.

mpeterson
quelle
10

Erstellen Sie eine Liste mit benannten Tupeln

Es kann oft sehr praktisch sein, namedtuple zu verwenden . Zum Beispiel haben Sie ein Wörterbuch mit 'Name' als Schlüssel und 'Punktzahl' als Werte wie:

d = {'John':5, 'Alex':10, 'Richard': 7}

Sie können die Elemente als Tupel auflisten, sortieren, wenn Sie möchten, und den Namen und die Punktzahl erhalten. Nehmen wir an, der Spieler mit der höchsten Punktzahl (Index = 0) sieht sehr pythonisch so aus:

>>> player = best[0]

>>> player.name
        'Alex'
>>> player.score
         10

Wie macht man das:

Liste in zufälliger Reihenfolge oder Reihenfolge von Sammlungen.OrderedDict :

import collections
Player = collections.namedtuple('Player', 'name score')
players = list(Player(*item) for item in d.items())

in der Reihenfolge, sortiert nach Wert ('Punktzahl'):

import collections
Player = collections.namedtuple('Player', 'score name')

zuerst mit der niedrigsten Punktzahl sortiert:

worst = sorted(Player(v,k) for (k,v) in d.items())

sortiert mit der höchsten Punktzahl zuerst:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)
Remi
quelle
7

Was Sie wollen , ist dict‚s items()und iteritems()Methoden. itemsGibt eine Liste von (Schlüssel-, Wert-) Tupeln zurück. Da Tupel unveränderlich sind, können sie nicht rückgängig gemacht werden. Daher müssen Sie die Elemente iterieren und neue Tupel erstellen, um die umgekehrten Tupel (Wert, Schlüssel) zu erhalten. Für die Iteration iteritemsist dies vorzuziehen, da ein Generator zum Erzeugen der (Schlüssel-, Wert-) Tupel verwendet wird, anstatt die gesamte Liste im Speicher zu halten.

Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = { 'a': 1, 'b': 2, 'c': 3 }
>>> a.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v,k) for (k,v) in a.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]
>>> 
Barry Wark
quelle
6
[(k,v) for (k,v) in d.iteritems()]

und

[(v,k) for (k,v) in d.iteritems()]
Robert Rossney
quelle
7
"[(k, v) für (k, v) in d.iteritems ()]" ist ein schreckliches Äquivalent zu d.items ()
Devin Jeanpierre
5

Dies sind die wichtigsten Änderungen gegenüber Python 3.x und Python 2.x.

Für Python3.x verwenden

dictlist = []
for key, value in dict.items():
    temp = [key,value]
    dictlist.append(temp)

Für Python 2.7 verwenden

dictlist = []
for key, value in dict.iteritems():
    temp = [key,value]
    dictlist.append(temp)
Tessaracter
quelle
4
>>> a = {'a': 1, 'b': 2, 'c': 3}

>>> [(x, a [x]) für x in a.keys ()]
[('a', 1), ('c', 3), ('b', 2)]

>>> [(a [x], x) für x in a.keys ()]
[(1, 'a'), (3, 'c'), (2, 'b')]
ismail
quelle
4

Nach keys()und values()Methoden des Wörterbuchs und zip.

zip gibt eine Liste von Tupeln zurück, die sich wie ein geordnetes Wörterbuch verhält.

Demo:

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> zip(d.keys(), d.values())
[('a', 1), ('c', 3), ('b', 2)]
>>> zip(d.values(), d.keys())
[(1, 'a'), (3, 'c'), (2, 'b')]
Vivek Sable
quelle
Dies funktionierte für mich als Alternative dazu collections.OrderedDict()funktioniert besser mit mehreren Versionen von Python HTTP Requests lib. Auch wenn ich den zipFunktionsnamen nicht als etwas vage / überladen mag .
MarkHu
Beachten Sie, dass die zip-ifizierung kein "tiefes" Casting ist. Wenn also verschachtelte Kinder vorhanden sind, sind diese nicht betroffen. Möglicherweise müssen Sie Ihre eigene Rekursion würfeln.
MarkHu
3
d = {'John':5, 'Alex':10, 'Richard': 7}
list = []
for i in d:
   k = (i,d[i])
   list.append(k)

print list
Harish
quelle
2
Obwohl dieser Code zur Lösung des Problems beitragen kann, erklärt er nicht, warum und / oder wie er die Frage beantwortet. Die Bereitstellung dieses zusätzlichen Kontextes würde den langfristigen Bildungswert erheblich verbessern. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der Einschränkungen und Annahmen.
Toby Speight
2

Ein einfacher wäre

list(dictionary.items())  # list of (key, value) tuples
list(zip(dictionary.values(), dictionary.keys()))  # list of (key, value) tuples

Der zweite ist nicht einfacher, aber ja.

Ketan
quelle