Dictionary cpython 3.6听写理解中的听写顺序

Dictionary cpython 3.6听写理解中的听写顺序,dictionary,python-3.6,dictionary-comprehension,Dictionary,Python 3.6,Dictionary Comprehension,因为在CPython 3.6中,dict是订购的(我知道它不能保证使用,但使用起来非常棒),所以我希望下面的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_s

因为在CPython 3.6中,dict是订购的(我知道它不能保证使用,但使用起来非常棒),所以我希望下面的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}
如果我只是在项目元组上使用列表理解,则保留顺序:

[(k, v) for k, v in jrn_blocks.items() if k in recip]
# -> gives me: [('header', 0), ('open', 1), ('close_no_save', 4)]
当我尝试从这些元组创建字典时,顺序再次丢失:

dict([(k, v) for k, v in jrn_blocks.items() if k in recip])
# -> gives me: {'close_no_save': 4, 'header': 0, 'open': 1}
这是预期的行为吗
是否在后台进行字母键排序?
或者有没有另一种优雅的方式来进行这种“dict过滤器”,同时保持秩序

提前非常感谢

我终于发现自己:
当我键入以下内容时,我被回复返回的内容愚弄了:

{k: v for k, v in jrn_blocks.items() if k in recip}
# {'close_no_save': 4, 'header': 0, 'open': 1}
但当我将字典理解的结果存储在一个变量中时,我发现键的顺序符合预期:

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}