2017-08-04 3 views
0

Da in CPython 3.6 dicts bestellt werden (ich weiß es nicht garantiert ist - dennoch fantastisch zu verwenden), so erwartete ich das folgende dict Verständnis um den Auftrag zu erhalten:CPython 3.6 dict Ordnung in dict Verständnis

# attempt to get only specific k:v from dict jrn_blocks in order 
jrn_blocks = {"header":0, "open":1, "detached":2, "rps_command":3, "close_no_save":4} 
recip = "header,open,close_no_save" 
{k: v for k, v in jrn_blocks.items() if k in recip} 
# -> gives me: {'close_no_save': 4, 'header': 0, 'open': 1} 
# -> I would expect: {'header': 0, 'open': 1, 'close_no_save': 4} 

Wenn ich benutze nur eine Liste Verständnis auf Artikel Tupeln, um aufbewahrt wird:

[(k, v) for k, v in jrn_blocks.items() if k in recip] 
# -> gives me: [('header', 0), ('open', 1), ('close_no_save', 4)] 

Sobald ich versuche, ein Wörterbuch aus diesen Tupeln zu erstellen, wird der Auftrag wieder verloren:

dict([(k, v) for k, v in jrn_blocks.items() if k in recip]) 
# -> gives me: {'close_no_save': 4, 'header': 0, 'open': 1} 

Ist das erwartete Verhalten?
Gibt es eine alphabetische Sortierung im Hintergrund?
Oder gibt es eine andere elegante Möglichkeit, diese Art von "dict-Filter" zu machen, während die Ordnung erhalten bleibt?
Vielen Dank im Voraus!

Antwort

0

fand ich mich endlich aus:
ich von dem, was ich aus dem REPL zurückgekehrt wurde getäuscht wurde, als ich getippt:

{k: v for k, v in jrn_blocks.items() if k in recip} 
# {'close_no_save': 4, 'header': 0, 'open': 1} 

aber wenn ich das Ergebnis des Wörterbuchs Verständnisses in einer Variablen gespeichert, fand ich Die Schlüssel waren in der erwarteten Reihenfolge:

jd = {k: v for k, v in jrn_blocks.items() if k in recip} 
print(jd.keys()) 
# {'header': 0, 'open': 1, 'close_no_save': 4} 
Verwandte Themen