2009-03-23 9 views

Antwort

278
>>> 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 gewünschten Reihenfolge, aber dicts hat keine sowieso bestimmte Reihenfolge. Sortieren oder organisieren Sie es nach Bedarf.

See: items(), iteritems()


In Python 3.x, würden Sie nicht verwenden iteritems (die nicht mehr vorhanden ist), sondern items verwenden, die nun eine "Ansicht" in die Wörterbuch Artikel zurück . Siehe das Dokument What's New für Python 3.0 und das neue documentation on views.

+0

Artikel() gibt einen dict_keys in python3 anzuzeigen. Wickeln Sie diesen Aufruf mit einer Besetzung in eine Liste "list()". Siehe @ SilentGhosts Antwort – Erich

2
[(k,v) for (k,v) in d.iteritems()] 

und

[(v,k) for (k,v) in d.iteritems()] 
+6

"[(k, v) für (k, v) in d.iteritems()]" ist eine schreckliche Entsprechung zu d.items() –

5

Was Sie wollen, ist dict ‚s items() und iteritems() Methoden. items gibt eine Liste von (Schlüssel-, Wert-) Tupeln zurück. Da Tupel unveränderlich sind, können sie nicht umgekehrt werden. Daher müssen Sie die Elemente iterieren und neue Tupel erstellen, um die umgekehrten (Wert-, Schlüssel-) Tupel zu erhalten. Für Iteration ist iteritems vorzuziehen, da es einen Generator verwendet, um die Tupel (Schlüssel, Wert) zu erzeugen, anstatt die gesamte Liste im Speicher zu behalten.

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

Sie können List Comprehensions verwenden.

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

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

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

das andere Beispiel.

Read more about list comprehensions Wenn Sie möchten, ist es sehr interessant, was Sie damit machen können.

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

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

>>> [(a[x],x) for x in a.keys() ] 
[(1, 'a'), (3, 'c'), (2, 'b')] 
30

da niemand sonst habe ich werde py3k Versionen hinzu:

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

Erstellen Sie eine Liste von namedtuples

Es kann oft sehr praktisch sein namedtuple zu verwenden.Zum Beispiel haben Sie ein Wörterbuch von ‚name‘ als Schlüssel und ‚Partitur‘ als Werte wie:

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

Sie die Einzelteile als Tupel auflisten, sortiert, wenn Sie mögen, und den Namen und den Wert von, lassen Sie uns sagen die Spieler mit der höchsten Punktzahl (Index = 0) sehr Pythonically wie folgt aus:

>>> player = best[0] 

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

Wie dies tun:

Liste in zufälliger Reihenfolge oder Aufrechterhaltung der Ordnung von collections.OrderedDict:

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

, um, nach Wert sortiert ('Score'):

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

mit niedrigste Punktzahl sortiert zuerst:

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

mit der höchsten Punktzahl sortiert zuerst:

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

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

zip wird eine Liste von Tupeln zurückgeben, 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')] 
+0

Dies funktionierte für mich als eine Alternative zu 'collections.OrderedDict () 'das funktioniert besser mit mehreren Versionen von Python HTTP Requests lib. Auch wenn ich den Namen der 'Zip'-Funktion nicht als vage/überladen empfinde. – MarkHu

+0

Beachten Sie, dass die 'zip'-ification kein" tiefes "Casting ist, d. H. Wenn verschachtelte Kinder vorhanden sind, sind sie nicht betroffen. Möglicherweise müssen Sie Ihre eigene Rekursion durchführen. – MarkHu

2
d = {'John':5, 'Alex':10, 'Richard': 7} 
list = [] 
for i in d: 
    k = (i,d[i]) 
    list.append(k) 

print list 
+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 seinen langfristigen Bildungswert erheblich verbessern. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erläuterung hinzuzufügen, einschließlich der Einschränkungen und Annahmen. –

Verwandte Themen