字典.keys()获得的键列表元素顺序是随机的吗?

2020-01-02 09:03:17 +08:00
 oldbird

python2,dict 对象的 keys()方法获得的键列表中的元素顺序是固定的还是随机的? 用少量数据试了下,看上去好像是固定且有规律的(升序?) dict.values()是按 keys()结果的顺序输出的?

6570 次点击
所在节点    Python
19 条回复
imn1
2020-01-02 09:05:57 +08:00
3.5 后是依次加入的顺序
d['b']=1
d['a']=2
顺序就是 b a
sikariba
2020-01-02 09:11:02 +08:00
我怎么记得是 3.7,PyPy 不记得,CPython 是 3.6 实现的,然后是到 3.7 才推广到全语言的
lihongjie0209
2020-01-02 09:16:20 +08:00
Python 不知道, 但是在 Java 中, 为了避免客户依赖这种特性, 哪怕是内部有序的, 返回给你的时候都会打乱.

既然使用 hash 表, 就不要再考虑顺序了
jdhao
2020-01-02 09:18:33 +08:00
随机的,需要顺序,用 ordered dict
love
2020-01-02 09:31:26 +08:00
@lihongjie0209 hash 顺序挺有用,只要库明确支持就可以放心用,比如我大 js 明确可以依赖 key 顺序
drawstar
2020-01-02 09:33:56 +08:00
我记得 python 中好像是随机的
josephpei
2020-01-02 09:36:04 +08:00
Python 3.7+ https://docs.python.org/3.7/whatsnew/3.7.html

In Python 3.7.0 the insertion-order preservation nature of dict objects has been declared to be an official part of the Python language spec. Therefore, you can depend on it.
josephpei
2020-01-02 09:38:19 +08:00
go 之前版本是键列表是有序的,后来为了避免大家依赖这个,新版本改成无序的了
hjq98765
2020-01-02 10:22:36 +08:00
不是随机的,感觉是排过序的:

>>> {1:2,3:4}.keys()
>>> [1, 3]

--------------------

>>> {3:2,1:4}.keys()
>>> [1, 3]
tkmiles
2020-01-02 10:24:23 +08:00
看版本, 3.6 之前是"无序"的, 也就是 hash 顺序

3.6 之后则是按 key 插入顺序
axer0912
2020-01-02 10:30:32 +08:00
dart 有一个叫 LinkedHashMap,那是有顺序的
tfdetang
2020-01-02 10:30:55 +08:00
从 python3.6 起就是有序的了,之前都不是有序的
fank99
2020-01-02 10:53:21 +08:00
虽然有 order dict,但内部是有序的。
如同上面老哥所述,在 3.x ( x 是几我给忘了)后的版本是有序的
littlewey
2020-01-02 10:54:37 +08:00
建议你把自己的问题变成关键词,Google 一下。
python dict keys ordering
ibreaker
2020-01-02 11:10:41 +08:00
@littlewey。。。。。
nongmei
2020-01-02 11:56:55 +08:00
记得 python 的字典是哈希存储,有顺序,但不是你插入的顺序
crella
2020-01-02 14:05:18 +08:00
ruby2.6.4 是按插入的顺序
crella
2020-01-02 14:07:10 +08:00
2.5.7 也是。不过为什么会出现需要 hash 的键自动排序的情况呢?
oldbird
2020-01-02 20:57:48 +08:00
在 py2.7 试了输出任意次 keys(),每次输出的列表都是一样的,可能应该这样理解:keys()结果只有一种固定的排列情况,这个固定的序列中元素的顺序是任意的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/634283

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX