404 Stimmen

Wie kann man Schlüssel/Werte in der gleichen Reihenfolge wie angegeben halten?

Ich habe ein Wörterbuch, das ich in einer bestimmten Reihenfolge deklariert habe, und möchte es immer in dieser Reihenfolge halten. Die Schlüssel/Werte können nicht wirklich in der Reihenfolge auf der Grundlage ihres Wertes gehalten werden, ich möchte nur, dass es in der Reihenfolge, die ich es deklariert.

Wenn ich also das Wörterbuch habe:

d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}

Es ist nicht in dieser Reihenfolge, wenn ich es anzeigen oder iterieren durch es, gibt es eine Möglichkeit, um sicherzustellen, dass Python die explizite Reihenfolge, die ich die Schlüssel/Werte in deklariert hält?

7voto

smushface Punkte 89

Ich bin auf diesen Beitrag gestoßen, als ich versucht habe, herauszufinden, wie ich OrderedDict zum Laufen bekomme. PyDev für Eclipse konnte OrderedDict überhaupt nicht finden, also entschied ich mich, ein Tupel der Schlüsselwerte meines Wörterbuchs so zu erstellen, wie ich sie gerne geordnet hätte. Wenn ich meine Liste ausgeben musste, iterierte ich einfach durch die Werte des Tupels und fügte den iterierten "Schlüssel" aus dem Tupel in das Wörterbuch ein, um meine Werte in der Reihenfolge abzurufen, in der ich sie brauchte.

Beispiel:

test_dict = dict( val1 = "hi", val2 = "bye", val3 = "huh?", val4 = "what....")
test_tuple = ( 'val1', 'val2', 'val3', 'val4')
for key in test_tuple: print(test_dict[key])

Es ist ein bisschen umständlich, aber ich stehe unter Zeitdruck, und das ist die Lösung, die ich gefunden habe.

Anmerkung: Der Ansatz einer Liste von Listen, den jemand anderes vorgeschlagen hat, macht für mich nicht wirklich Sinn, da Listen geordnet und indiziert sind (und auch eine andere Struktur als Wörterbücher haben).

7voto

nealous3 Punkte 604

Mit einem Wörterbuch kann man nicht wirklich machen, was man will. Sie haben bereits das Wörterbuch d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10} erstellt. Ich habe festgestellt, dass es keine Möglichkeit gibt, eine bereits erstellte Datei in Ordnung zu halten. Was ich tat, war eine Json-Datei stattdessen mit dem Objekt zu machen:

{"ac":33,"gw":20,"ap":102,"za":321,"bs":10}

Ich habe:

r = json.load(open('file.json'), object_pairs_hook=OrderedDict)

dann verwendet:

print json.dumps(r)

zu überprüfen.

5voto

user11502624 Punkte 51
from collections import OrderedDict
list1 = ['k1', 'k2']
list2 = ['v1', 'v2']
new_ordered_dict = OrderedDict(zip(list1, list2))
print new_ordered_dict
# OrderedDict([('k1', 'v1'), ('k2', 'v2')])

2voto

Evan Byrne Punkte 1025

Ich hatte ein ähnliches Problem bei der Entwicklung eines Django-Projekts. Ich konnte OrderedDict nicht verwenden, weil ich eine alte Version von Python verwendete, also war die Lösung, die SortedDict-Klasse von Django zu verwenden:

https://code.djangoproject.com/wiki/SortedDict

z.B.,

from django.utils.datastructures import SortedDict
d2 = SortedDict()
d2['b'] = 1
d2['a'] = 2
d2['c'] = 3

Hinweis: Diese Antwort ist ursprünglich aus dem Jahr 2011. Wenn Sie Zugang zu Python Version 2.7 oder höher haben, dann sollten Sie Zugang zu dem jetzt standardmäßigen collections.OrderedDict wofür andere in diesem Thread bereits zahlreiche Beispiele geliefert haben.

2voto

Ville Punkte 3790

Eine andere Alternative ist die Verwendung von Pandas dataframe da es die Reihenfolge und die Indexpositionen der Elemente in einer diktatähnlichen Struktur garantiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X