2016-04-05 8 views
-5

Zum Beispiel:Bestellt dict Schlüssel zurück, um auch zu bestellen?

my_dict = OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) 

Wenn eine Operation Schlüssel zu erhalten heißt my_dict.keys() oder my_dict.iterkeys() getan wird, ist es zurückzubringen garantiert: ['apple','banana','orange','pear']?

Dies ist nicht explizit in der Dokumentation erwähnt.

+0

Ja. "OrderedDict - dict Unterklasse, die die Reihenfolge Einträge erinnert wurden hinzugefügt" – AndreyT

+0

@AndreyT Ich weiß über die Elemente, oder iterating, meine Frage ist speziell über die. Keys() oder .values ​​() Methoden – DhruvPathak

+4

@DhruvPathak: und was bringt Sie zum Nachdenken Sie werden nicht sein? Schlüssel-Wert-Paare sind die Einträge. Beim Iterieren über Schlüssel, Werte oder Elemente müssen alle dieselbe Reihenfolge verwenden. Es wäre * sehr * überraschend, wenn das nicht der Fall wäre und explizit als Ausnahme dokumentiert werden müsste. Es gibt keine solche Ausnahme in der Dokumentation. –

Antwort

3

Ja, Alle Iterationen werden garantiert die gleiche Reihenfolge verwenden.

Wenn nicht, wäre das eine sehr große Ausnahme, die explizit dokumentiert werden müsste. Die Dokumentation enthält keine solchen Ausnahmen.

Sie können immer die implementation überprüfen, die explizit von der Oberseite der Moduldokumentation verbunden ist. Sie werden feststellen, dass alle Methodenimplementierungen eine Iteration über self verwenden, entweder direkt oder über iter(self) oder list(self); alle diese durch die OrderedDict.__iter__ Verfahren zugeführt werden, die Schlüssel, um erzeugt:

def __iter__(self): 
    'od.__iter__() <==> iter(od)' 
    # Traverse the linked list in order. 
    root = self.__root 
    curr = root[1]         # start at the first node 
    while curr is not root: 
     yield curr[2]        # yield the curr[KEY] 
     curr = curr[1]        # move to next node 

Zum Beispiel kann die OrderedDict.values() Methode verwendet diesen Schlüssel auf Werte abbilden:

def values(self): 
    'od.values() -> list of values in od' 
    return [self[key] for key in self] 
1

Ja, OrderedDict die Schlüssel zurückgeben in Ordnung. Es ist jedoch erwähnenswert, dass the keys views compare order insensitive etwas überraschend ist.

Hier ist die 2,7 reference python implementation von __iter__, die beide von .keys und .iterkeys Methoden delegieren:

def __iter__(self): 
    'od.__iter__() <==> iter(od)' 
    # Traverse the linked list in order. 
    root = self.__root 
    curr = root[1]         # start at the first node 
    while curr is not root: 
     yield curr[2]        # yield the curr[KEY] 
     curr = curr[1]        # move to next node 

self.__root hier nur eine Liste ist.

Hinweis: tatsächliche Implementierung ist in C-Code.

+0

Ich sehe kein C Implementierung für OrderedDict in Python 2. Nur Python 3 hat eine beschleunigte Version. –

0

Kurze Antwort: ja

Lange Antwort: „die verknüpfte Liste, um Traverse“

die Umsetzung der Tasten (und auch die Werte) -Methode basiert auf dem Verfahren, das __iter__

def keys(self): 
     return list(self) 

    def values(self): 
     return [self[key] for key in self] 

können Sie überprüfen die source code im documentation verbunden:

Verwandte Themen