将字典转换为列表时如何保留原始顺序(不排序)?
问题描述
我有一个字典:
{'16022000': 5172863.79, '21349000': 264853.56, '21362000': -5437717.35}
针对正负键/值创建了4个列表:
list({(g) for g, v in gv.items() if v >= 0}) list({(g) for g, v in gv.items() if v <= 0}) list({(v) for g, v in gv.items() if v >= 0}) list({(v) for g, v in gv.items() if v <= 0})
打印结果为:
['16022000', '21349000'] [264853.56, 5172863.79] ['21362000'] [-5437717.35]
期望结果是:
['16022000', '21349000'] [5172863.79, 264853.56]
看起来数值被自动排序了,怎么避免这种情况?
解决方法
问题出在你用了集合推导式,集合的特性是无序且自动去重,它不会保留原字典的键值对顺序,甚至会基于哈希值重新排列元素,所以数值才会被打乱排序。
要保留原字典的顺序,直接用列表推导式代替集合推导式,不用套一层集合:
# 正数值对应的键列表 [g for g, v in gv.items() if v >= 0] # 负数值对应的键列表 [g for g, v in gv.items() if v <= 0] # 正数值列表 [v for g, v in gv.items() if v >= 0] # 负数值列表 [v for g, v in gv.items() if v <= 0]
运行后就能得到你想要的结果:
['16022000', '21349000'] [5172863.79, 264853.56]
补充:Python 3.7及以上版本的普通字典是有序的,会严格保留键值对的插入顺序,所以用列表推导式遍历items()时,会完全遵循原字典的顺序生成列表。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

