cpython 3.6 字典理解中的字典顺序

cpython 3.6 dict order in dict comprehension

因为在 CPython 3.6 中命令是有序的(我知道这不能保证 - 但使用起来很棒),所以我希望以下命令理解能够保持顺序:

# 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 filter" ?
提前致谢!

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

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