值和密钥保证一致的顺序?

bec*_*cko 4 dictionary julia

当应用于Dict,将values(...)keys(...)匹配顺序返回的项目?

换句话说,zip(keys(d), values(d))保证准确包含字典的键值对d

Mic*_*gge 6

选项1

当前的Julia源代码表示Dict()对象的键和值存储为Array对象,这些对象是有序的.因此,您可以单独使用values()keys()单独使用,如在您的问题表达中.但是,依赖于未记录的引擎盖实现细节是危险的,因为它们可能会在没有通知的情况下进行更改.

选项2

一个OrderedDictDataStructures包(连同功能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.


Sal*_*apa 5

目前你的断言似乎是正确的:

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 订购是一个好主意,我们应该继续这样做。

也可以看看:

  • #10116 WIP:尝试有序字典表示

最重要的是,你想做什么?也许 anOrederedDict就是您所需要的?


Jef*_*son 5

是的,keys并按values匹配的顺序退回商品。除非,正如 Dan Getz 上面指出的那样,字典在使用两个迭代器之间进行了修改。

我认为字典不具有这种行为是相对反常的。对我们来说,显然顺序应该匹配,以至于我们甚至没有想到在文档中明确提及这一点。