2012-04-10 16 views
0

So habe ich dieses Wörterbuch:(Python) Konvertieren eines Wörterbuchs in eine Liste?

ScoreDict = {"Blue": {'R1': 89, 'R2': 80}, 
      "Brown": {'R1': 61, 'R2': 77}, 
      "Purple": {'R1': 60, 'R2': 98}, 
      "Green": {'R1': 74, 'R2': 91}, 
      "Red": {'R1': 87, 'Lon': 74}} 

Gibt es eine Möglichkeit, wie ich dieses Wörterbuch in eine Liste wie folgt umwandeln:

ScoreList = [['Blue', 89, 80], ['Brown', 61, 77], 
['Purple', 60, 98], ['Green', 74, 91], ['Red', 87, 74]] 

Ich bin nicht allzu vertraut mit Wörterbüchern, so dass ich wirklich brauche hier Hilfe. Danke im Voraus!

+2

Ist die Reihenfolge der Zahlen eine Rolle? – agf

Antwort

1

Sie können versuchen, dies zu tun:

ScoreList = [[key] + value.values() for key, value in ScoreDict.iteritems()] 

In einer Schleife Form wahrscheinlich macht es mehr Sinn:

ScoreList = [] 

for key, value in ScoreDict.iteritems(): 
    temp = [] 

    temp.append(key) 
    temp.extend(value.values()) 

    ScoreList.append(temp) 

Das Hauptproblem Sie Gesicht ist, dass Wörterbücher sind nicht bestellt. Die Elemente werden durch ihre Hashes indiziert, was bedeutet, dass value.values() die Werte des Wörterbuchs nicht in einer bestimmten Reihenfolge zurückgibt.

+0

Danke @Blender! Das funktioniert perfekt! Ordnung spielt in diesem Zusammenhang keine Rolle, also ist alles gut! – DarsAE

1

Nicht zuverlässig. Es gibt keinen Grund, warum die Schlüssel in dieser Reihenfolge bleiben würden, daher ist es unmöglich sicherzustellen, dass Sie diese Liste aus diesem Wörterbuch erhalten können.

+0

Ich wollte sagen, dass die Schlüssel sortiert werden könnten, aber dann sah ich, dass nicht alle verschachtelten dict Schlüssel identisch waren. –

+0

OrderedDict aus Sammlungen Paket könnte verwendet werden, um die initialisierte Reihenfolge der Schlüssel im Wörterbuch zu bekommen, ja? – fixxxer

2

Die Zahlen werden nicht in der ursprünglichen Reihenfolge gespeichert, da ich dort keine logische Reihenfolge sehe.

>>> ScoreDict = {"Blue": {'R1': 89, 'R2': 80}, 
      "Brown": {'R1': 61, 'R2': 77}, 
      "Purple": {'R1': 60, 'R2': 98}, 
      "Green": {'R1': 74, 'R2': 91}, 
      "Red": {'R1': 87, 'Lon': 74}} 
>>> [[k]+i.values() for k,i in ScoreDict.iteritems()] 
[['Blue', 89, 80], ['Brown', 61, 77], ['Green', 74, 91], ['Red', 74, 87], ['Purple', 60, 98]] 
+0

Die Unterliste mit ''Red'' ist falsch. –

+1

Ich habe eine ähnliche, aber weniger elegante Lösung veröffentlicht. Ich denke, es ist wichtig zu beachten, dass dies ** nicht funktioniert, wenn Sie darauf zählen, dass der 2. und der 3. Punkt der Liste in einer bestimmten Reihenfolge sind. –

+2

Bekannt: Ich sagte es oben. – jamylak

0

(Dies ist extrem zerbrechlich!)

ScoreList = [[colour, rs["R1"], rs["R2" if "R2" in rs else "Lon"]] for colour, rs in ScoreDict.items()] 

Dies geht durch jedes Paar Schlüssel-Wert in ScoreDict und erstellt die Liste von ihm. Die wichtige Funktion ist hier .items() (documentation).

(Beachten Sie, in Python 2.x .iteritems sollte statt .items verwendet werden, um zu vermeiden eine Zwischenliste zu konstruieren.)

+0

'ScoreDict ['Red']' hat keinen '' R2''-Eintrag. –

+0

@ IgnacioVazquez-Abrams, ah, habe das nicht bemerkt! Vielen Dank :) – huon

1

Allgemein gesprochen, wenn Sie ein normales Wörterbuch verwenden, würde der Auftrag nicht erhalten. Wenn Sie die Reihenfolge beibehalten möchten, verwenden Sie besser ein Ordered Dict.

Zuerst Angenommen, Sie müssen nicht auf die Reihenfolge erhalten, dann, Sie so etwas tun kann die gewünschte Ausgangs

>>> [([k]+v.values()) for k,v in ScoreDict.items()] 
[['Blue', 89, 80], ['Brown', 61, 77], ['Green', 74, 91], ['Red', 74, 87], ['Purple', 60, 98]] 
>>> 

zu bekommen, aber wenn Sie über den Auftrag ernst sind, sollten Sie Ihre ursprünglichen Daten sein organisiert als OrderedDict. Und hier ist ein Beispiel, es zu tun

>>> ScoreDict 
OrderedDict([('Blue', OrderedDict([('R1', 89), ('R2', 80)])), ('Brown', OrderedDict([('R1', 61), ('R2', 77)])), ('Purple', OrderedDict([('R1', 60), ('R2', 98)])), ('Green', OrderedDict([('R1', 74), ('R2', 91)])), ('Red', OrderedDict([('R1', 87), ('R2', 74)]))]) 

und man kann leicht sehen, wie die obige Lösung anwenden würde das gleiche Ergebnis, aber die Erhaltung der Ordnung

>>> [([k]+v.values()) for k,v in ScoreDict.items()] 
[['Blue', 89, 80], ['Brown', 61, 77], ['Purple', 60, 98], ['Green', 74, 91], ['Red', 87, 74]] 
Verwandte Themen