You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将字典转换为列表时如何保留原始顺序(不排序)?

问题描述

我有一个字典:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:40:28