2017-08-04 2 views
0

Puisqu'en CPython 3.6 dicts sont commandés (je sais que ce n'est pas garanti - mais génial à utiliser), donc je me attendais la compréhension dict suivante pour préserver l'ordre:CPython 3.6 pour dict dans la compréhension dict

# 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} 

Si Je viens d'utiliser une compréhension de la liste tuples d'objets, ordre est conservé:

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

dès que je tente de créer un dictionnaire de ces tuples, l'ordre est perdu à nouveau:

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

Est-ce que ce comportement est attendu?
Y a-t-il un tri alphabétique des clés en arrière-plan?
Ou y a-t-il une autre façon élégante de faire ce genre de "filtre dict" tout en préservant l'ordre?
Merci beaucoup d'avance!

Répondre

0

Je me suis finalement découvert:
je dupé par ce que je suis rentré de la REPL quand je tapais:

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

mais quand je stockaient le résultat de la compréhension dictionnaire dans une variable, j'ai trouvé les clés étaient dans l'ordre prévu:

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}