【问题标题】:cpython 3.6 dict order in dict comprehensiondict理解中的cpython 3.6 dict顺序
【发布时间】:2018-01-12 09:48:00
【问题描述】:

由于在 CPython 3.6 中 dicts 是有序的(我知道它不能保证 - 但使用起来很棒),所以我希望以下 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}

这是预期的行为吗?
后台是否进行了字母键排序?
还是有另一种优雅的方式来做这种“字典过滤器”,同时保持顺序?
提前非常感谢您!

【问题讨论】:

    标签: dictionary python-3.6 dictionary-comprehension


    【解决方案1】:

    我终于找到了自己:
    当我输入时,我被 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}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-05
      • 2018-12-02
      • 2023-03-23
      • 2016-04-09
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      相关资源
      最近更新 更多