Julia中Dict字典的keys键集合索引顺序是如何确定的?
原因说明
Julia 原生的 Dict 是基于哈希表实现的无序字典,官方不保证任何遍历顺序:既不会保留键值对的插入顺序,也不会自动对键做升/降序排列。
你观察到的键输出顺序,是键的哈希值经过哈希函数映射后,在哈希表桶中的实际存储位置决定的。这个顺序会受键的哈希计算结果、哈希表负载因子、扩容历史影响,没有固定规律,绝对不能在业务代码中依赖这个顺序做逻辑判断。
实现固定顺序的方案
根据你的需求选择对应字典类型即可:
- 如果你需要严格保留键值对的定义/插入顺序,使用
OrderedDict,该类型由官方维护的DataStructures包提供,遍历键、值、键值对时的顺序和你插入元素的顺序完全一致。
示例代码:# 首次使用前先安装依赖包 using Pkg Pkg.add("DataStructures") # 引入OrderedDict using DataStructures dictionary = OrderedDict(1 => 77, 2 => 66, 3 => 1) keys(dictionary) # 输出: # KeySet for a OrderedDict{Int64, Int64} with 3 entries. Keys: # 1 # 2 # 3 collect(keys(dictionary))[1] # 输出: 1 - 如果你需要始终按键的大小排序遍历(和插入顺序无关),可以使用同包下的
SortedDict,默认按照键的升序排列,支持自定义排序规则。
示例代码:using DataStructures # 即使插入顺序打乱,输出键始终按升序排列 dictionary = SortedDict(3 => 1, 1 => 77, 2 => 66) keys(dictionary) # 输出键顺序为1、2、3
注意:只要业务逻辑依赖字典的遍历顺序,就不要使用原生无序
Dict,不同Julia版本、不同运行环境下原生Dict的遍历顺序都可能发生变化。
内容的提问来源于stack exchange,提问作者Shayan
相关产品推荐
相关产品推荐

