Die Reihenfolge der Schlüssel in Wörterbüchern

100

Code:

d = {'a': 0, 'b': 1, 'c': 2}
l = d.keys()

print l

Dies wird gedruckt ['a', 'c', 'b']. Ich bin mir nicht sicher, wie die Methode keys()die Reihenfolge der Schlüsselwörter innerhalb von l bestimmt . Ich möchte jedoch in der Lage sein, die Schlüsselwörter in der "richtigen" Reihenfolge abzurufen. Die richtige Reihenfolge würde natürlich die Liste erstellen ['a', 'b', 'c'].

Rechteck
quelle
3
Wenn Python-Wörterbücher wie die meisten sind, handelt es sich tatsächlich um Hash-Tabellen. Dies bedeutet unter anderem, dass die Reihenfolge der Schlüssel nicht garantiert oder gar festgelegt ist. Insbesondere würde es sich nicht an die Reihenfolge erinnern, in der Schlüssel hinzugefügt werden.
CHao
3
@cHao: Dies bedeutet im Wesentlichen, dass Ihr Programm unbestimmt ist, wenn Sie die Elemente in einem Wörterbuch durchlaufen?
HelloGoodbye
4
@HelloGoodbye: Ich würde nicht so weit gehen; Es gibt dort immer noch sehr vorhersehbares Verhalten. Jede vollständige Iteration sieht genau eines von jedem Schlüssel / Wert-Paar. In den meisten Sprachen werden sie sogar jedes Mal in derselben Reihenfolge angezeigt. Sofern die Dokumente keine bestimmte Bestellung garantieren, sollten Sie nicht damit rechnen, dass es sich um die gewünschte Bestellung handelt. (Einige Sprachen (wie Perl) werden die Reihenfolge tatsächlich ein wenig zufällig festlegen - angeblich aus Sicherheitsgründen, aber ich denke, es ist wirklich nur, um Sie von der Gewohnheit zu befreien, sich auf nicht spezifiziertes Verhalten zu verlassen. :) Ich denke nicht, dass Python ganz ist das böse, aber eh ...)
cHao
1
Die Reihenfolge ist dieselbe, sofern das Diktat nicht geändert wurde. Aus dem Handbuch: "Wenn items (), keys (), values ​​(), iteritems (), iterkeys () und itervalues ​​() aufgerufen werden, ohne dass Änderungen am Wörterbuch vorgenommen wurden, entsprechen die Listen direkt. Dies ermöglicht die Erstellung von (Wert-, Schlüssel-) Paaren mit zip (): Paare = zip (d.values ​​(), d.keys ()). "
Steveayre
2
@sfranky Ich denke, was steveayre gemeint hat, ist, dass die Reihenfolge zwischen dem, was Sie mit den verschiedenen genannten Methoden erhalten, dieselbe ist, nicht die gleiche wie die Reihenfolge, in der die Elemente geschrieben wurden.
Bli

Antworten:

77

Sie können OrderedDict (erfordert Python 2.7) oder höher verwenden.

Beachten Sie auch, dass dies OrderedDict({'a': 1, 'b':2, 'c':3})nicht funktioniert, da das dict, mit dem Sie erstellen, {...}die Reihenfolge der Elemente bereits vergessen hat. Stattdessen möchten Sie verwenden OrderedDict([('a', 1), ('b', 2), ('c', 3)]).

Wie in der Dokumentation erwähnt, können Sie dieses Rezept für Versionen unter Python 2.7 verwenden .

Abhinav Gupta
quelle
18
Denken Sie daran , ist die Reihenfolge eines OrderedDict die Einfügung Ordnung; Die Tasten werden nur in alphabetischer Reihenfolge ausgegeben, wenn Sie sie auf diese Weise eingefügt haben.
Hugh Bothwell
es ist , was er zeigte , als ein vereinfachtes Beispiel; es kann oder kann keine Beziehung dazu haben, wie er es tatsächlich verwenden will. Ich habe zuvor Leute getroffen, die erwartet hatten, dass OrderedDict willkürliche Einfügungen in sortierter Reihenfolge zurückgibt, und deshalb hatte ich das Gefühl, ich sollte darauf hinweisen.
Hugh Bothwell
118

Python 3.7+

In Python 3.7.0 wurde die Beibehaltung der Einfügungsreihenfolge von dictObjekten als offizieller Bestandteil der Python-Sprachspezifikation deklariert . Daher können Sie sich darauf verlassen.

Python 3.6 (CPython)

Ab Python 3.6 behalten Wörterbücher für die CPython-Implementierung von Python standardmäßig die Einfügereihenfolge bei. Dies wird jedoch als Implementierungsdetail angesehen. Sie sollten es weiterhin verwenden, collections.OrderedDictwenn Sie eine Einfügereihenfolge wünschen, die für andere Implementierungen von Python garantiert ist.

Python> = 2.7 und <3.6

Verwenden Sie die collections.OrderedDictKlasse, wenn Sie eine benötigen dict, die sich an die Reihenfolge der eingefügten Elemente erinnert.

Eugene Yarmash
quelle
48
>>> print sorted(d.keys())
['a', 'b', 'c']

Verwenden Sie die sortierte Funktion , mit der die übergebene Iteration sortiert wird .

Die .keys()Methode gibt die Schlüssel in einer beliebigen Reihenfolge zurück.

Mike Lewis
quelle
12
Dies funktioniert nicht, wenn Sie die ursprüngliche Bestellung möchten und diese nicht sortiert wurde.
Simon
12

Sortieren Sie einfach die Liste, wenn Sie sie verwenden möchten.

l = sorted(d.keys())
Drew
quelle
12

Von http://docs.python.org/tutorial/datastructures.html :

"Die Methode keys () eines Wörterbuchobjekts gibt eine Liste aller im Wörterbuch verwendeten Schlüssel in beliebiger Reihenfolge zurück (wenn Sie möchten, dass es sortiert wird, wenden Sie einfach die Funktion sorted () darauf an)."


quelle
1

Obwohl die Reihenfolge keine Rolle spielt, da das Wörterbuch eine Hashmap ist. Es hängt von der Reihenfolge ab, in der es eingeschoben wird:

s = 'abbc'
a = 'cbab'

def load_dict(s):
    dict_tmp = {}
    for ch in s:
        if ch in dict_tmp.keys():
            dict_tmp[ch]+=1
        else:
            dict_tmp[ch] = 1
    return dict_tmp

dict_a = load_dict(a)
dict_s = load_dict(s)
print('for string %s, the keys are %s'%(s, dict_s.keys()))
print('for string %s, the keys are %s'%(a, dict_a.keys()))

Ausgabe:
Für den String abbc sind die Schlüssel dict_keys (['a', 'b', 'c'])
für den String cbab, die Schlüssel sind dict_keys (['c', 'b', 'a']).

Zehai
quelle
Wörterbuch in Python sind Einfügung nur ab Version 3.6+ bestellt überprüfen Sie dies
Crivella