2009-11-05 19 views
111

Mögliche Duplizieren zur Liste:
How can I convert a Python dictionary to a list of tuples?Konvertieren von Python Wörterbuch

Ich versuche, einen Python-Wörterbuch in eine Python-Liste zu konvertieren, um einige Berechnungen durchzuführen.

#My dictionary 
dict = {} 
dict['Capital']="London" 
dict['Food']="Fish&Chips" 
dict['2012']="Olympics" 

#lists 
temp = [] 
dictList = [] 

#My attempt: 
for key, value in dict.iteritems(): 
    aKey = key 
    aValue = value 
    temp.append(aKey) 
    temp.append(aValue) 
    dictList.append(temp) 
    aKey = "" 
    aValue = "" 

Das ist mein Versuch es ... aber ich kann nicht herausfinden, was los ist?

+0

'Summe (dict.items(),())' – Natim

Antwort

92

Ihr Problem ist, dass Sie key und value in Anführungszeichen haben sie Strings zu machen, das heißt sind Sie aKey Einstellung der Zeichenfolge "key" und nicht der Wert der Variablen key enthalten. Außerdem löschen Sie nicht die temp Liste, also fügen Sie es jedes Mal hinzu, anstatt nur zwei Elemente darin zu haben.

Code zu beheben, versuchen Sie so etwas wie:

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

Sie brauchen nicht die Schleifenvariablen kopieren key und value in eine andere Variable, bevor sie so ich mit ihnen ausgestiegen. Ebenso müssen Sie zum Erstellen einer Liste keine Anhänge verwenden. Sie können sie einfach zwischen eckigen Klammern angeben, wie oben gezeigt. Und wir hätten dictlist.append([key,value]) machen können, wenn wir so kurz wie möglich sein wollten.

Oder verwenden Sie einfach dict.items(), wie vorgeschlagen wurde.

+1

Richtige Antwort wegen der Erklärung, was ich falsch gemacht habe . Wie Sie sehen können, bin ich Python ziemlich bekannt und alle Erklärungen werden sehr geschätzt. Prost! – Federer

+1

Wenn Sie Append-Listen wie diese verwenden, erstellen Sie eine Liste mit Listen. Was er wollte, war eine flache Liste, für die Sie extension() wie in Shays Antwort verwenden würden. –

+1

Das hat er nie gesagt, Ajith. Eine Liste von Listen ist eine gültige Python-Liste und eine viel bessere Interpretation eines "Wörterbuchs" als eine flache Liste, die nur Nicht-Listen-Werte enthält. Eine Liste von Listen ist zumindest in der Lage, Schlüssel und Werte noch zusammen gruppiert anzuzeigen. – codetaku

305
dict.items() 

Macht den Trick.

+7

wusste, dass ich es etwas lächerlich Pythonic Weg sein würde, dies zu tun, ich danke Ihnen sehr viel in der Tat. Ich finde die Dokumentation für Python ziemlich schwer zu lesen! – Federer

+12

@shylent ich denke, er meinte es als lächerlich offensichtlich/einfach/pythonisch – ofko

+1

Sie können immer * Hilfe (dict) * auf der Python-Kommandozeile verwenden und ersetzen * dict * mit dem lästigen Objekt, um eine Liste seiner Hilfsmethoden etc ., z.B * items (...) D.items() -> Liste von D's (Schlüssel, Wert) Paare, als 2-Tupel * –

19
>>> a = {'foo': 'bar', 'baz': 'quux', 'hello': 'world'} 
>>> list(reduce(lambda x, y: x + y, a.items())) 
['foo', 'bar', 'baz', 'quux', 'hello', 'world'] 

Um zu erklären: a.items() gibt eine Liste von Tupeln zurück. Das Hinzufügen von zwei Tupeln ergibt ein Tupel mit allen Elementen. Somit erzeugt die Reduktion ein Tupel, das alle Schlüssel und Werte enthält, und dann erstellt die Liste (...) daraus eine Liste.

+0

Interessant ... Es könnte irgendwo für diese Art von Zusammenführung verwendet werden. –

+1

Für python 3.^anstelle von reduce, benutze functools.reduce –

10

Wahrscheinlich wollen Sie gerade dies:

dictList = dict.items() 

Ihr Ansatz hat zwei Probleme. Zum einen verwenden Sie key und value in Anführungszeichen, die sind Strings mit den Buchstaben "Schlüssel" und "Wert", nicht mit den Variablen dieser Namen verwandt. Außerdem fügen Sie Elemente zur "temporären" Liste hinzu und entfernen nie alte Elemente, die bereits aus vorhergehenden Iterationen stammen. Stellen Sie sicher, dass Sie in jeder Iteration eine neue und leere temp Liste haben und verwenden Sie die key und value Variablen:

for key, value in dict.iteritems(): 
    temp = [] 
    aKey = key 
    aValue = value 
    temp.append(aKey) 
    temp.append(aValue) 
    dictList.append(temp) 

Beachten Sie auch, dass dies ohne die temporären Variablen kürzer geschrieben werden könnte:

for key, value in dict.iteritems(): 
    dictList.append([key, value]) 
36

Sie sollten Verwenden Sie dict.items().

Hier ist ein Einzeiler Lösung für Ihr Problem:

[(k,v) for k,v in dict.items()] 

und Ergebnis:

[('Food', 'Fish&Chips'), ('2012', 'Olympics'), ('Capital', 'London')] 

oder Sie tun können,

l=[] 
[l.extend([k,v]) for k,v in dict.items()] 

für:

['Food', 'Fish&Chips', '2012', 'Olympics', 'Capital', 'London'] 
+2

In python 2.6, mindestens, brauchst du dict.items() nicht: '[(k, v) für k, v in dict]'. – hughdbrown

+1

Python3.6 - '[x für x in dict.items()]' macht das Gleiche. – Blacksilver

2

Wenn Sie ein Wörterbuch nur erstellen, um eine Liste von Tupeln zu erstellen, könnte die Erstellung von Diktaten wie Sie sind ein Schmerz sein, könnten Sie in Verwendung von zip()

Ihr besonders nützlich, wenn Sie einen haben Überschrift und mehrere Zeilen. wenn ich zum Beispiel an, dass Sie Olympia Statistik für Länder wollen:

headers = ['Capital', 'Food', 'Year'] 
countries = [ 
    ['London', 'Fish & Chips', '2012'], 
    ['Beijing', 'Noodles', '2008'], 
] 

for olympics in countries: 
    print zip(headers, olympics) 

gibt

[('Capital', 'London'), ('Food', 'Fish & Chips'), ('Year', '2012')] 
[('Capital', 'Beijing'), ('Food', 'Noodles'), ('Year', '2008')] 

Sie wissen nicht, ob das ist das Endziel, und vom Thema sein meine, aber es könnte etwas sein, merken Sie sich.

127

Konvertieren von dict zu Liste ist in Python leicht gemacht. Drei Beispiele:

>> d = {'a': 'Arthur', 'b': 'Belling'} 

>> d.items() 
[('a', 'Arthur'), ('b', 'Belling')] 

>> d.keys() 
['a', 'b'] 

>> d.values() 
['Arthur', 'Belling'] 
+0

Ist es möglich, die Reihenfolge von 'values ​​()' anzugeben?Ist die Reihenfolge der Werte eines Standard-Diktats sogar definiert? –

+2

@MichaelScheper [Die Reihenfolge des Standarddikts ist nicht angegeben] (http://StackOverflow.com/a/9001529/638546) und die Reihenfolge der Werte kann sich von der Reihenfolge der Anzeigen unterscheiden. Man könnte jedoch [die obigen Listen sortieren] (https://wiki.python.org/moin/HowTo/Sorting) oder ** OrderedDict ** verwenden (siehe ersten Link). –

Verwandte Themen