选项1
当前的Julia源代码表示Dict()对象的键和值存储为Array对象,这些对象是有序的.因此,您可以单独使用values()和keys()单独使用,如在您的问题表达中.但是,依赖于未记录的引擎盖实现细节是危险的,因为它们可能会在没有通知的情况下进行更改.
选项2
一个OrderedDict从DataStructures包(连同功能values()和keys())可能是某些一致排序的最简单,最安全的方式.如果您没有特别需要订购,这没关系.
选项3
如果你不想处理安装和加载DataStructures包的麻烦 ,你可以使用Julia的内置语法来处理这种事情,例如
Mydict = Dict("a" => 1, "b" => 2, "c" => 1)
a = [(key, val) for (key, val) in Mydict]
Run Code Online (Sandbox Code Playgroud)
zip()问题公式中给出的使用只会增加这种情况下的复杂性和风险.
如果您希望实体分开,则可以使用:
Keys = [key for (key, val) in Mydict]
Values = [val for (key, val) in Mydict]
Run Code Online (Sandbox Code Playgroud)
或者只是参考你需要它a[idx][1]的idx元素Keys.
目前你的断言似乎是正确的:
julia> let
d = [i => i^2 for i in 1:10_000]
z = zip(keys(d), values(d))
for (pair, tupl) in zip(d, z)
@assert pair[1] == tupl[1] && pair[2] == tupl[2]
end
info("Success")
end
INFO: Success
Run Code Online (Sandbox Code Playgroud)
但正如 Michael Ohlrogge 所解释的那样,这是一个未记录的实现细节。
Stefan Karpinski 关于 show(dict) 的评论现在按#16743中的键排序:
这对于打印非常大的字典有性能影响。我认为这不是一个好主意。然而,我确实认为让 Dict 订购是一个好主意,我们应该继续这样做。
也可以看看:
最重要的是,你想做什么?也许 anOrederedDict就是您所需要的?
是的,keys并按values匹配的顺序退回商品。除非,正如 Dan Getz 上面指出的那样,字典在使用两个迭代器之间进行了修改。
我认为字典不具有这种行为是相对反常的。对我们来说,显然顺序应该匹配,以至于我们甚至没有想到在文档中明确提及这一点。