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

时间:2016-08-17 16:41:13

标签: dictionary julia

当应用于Dict时,values(...)keys(...)会按匹配顺序返回商品吗?

换句话说,zip(keys(d), values(d))是否保证恰好包含字典d的键值对?

4 个答案:

答案 0 :(得分:6)

选项1

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

选项2

来自OrderedDict包的DataStructures(以及函数values()keys())可能是确保一致排序的最简单,最安全的方法。如果您没有特别需要订购,那就没问题。

选项3

如果您不想处理安装和加载DataStructures软件包的麻烦,您可以使用Julia的内置语法来处理此类问题,例如< / p>

Mydict = Dict("a" => 1, "b" => 2, "c" => 1)

a = [(key, val) for (key, val) in Mydict]

在问题公式中使用zip()只会增加这种情况下的复杂性和风险。

如果您希望实体分开,则可以使用:

Keys = [key for (key, val) in Mydict]
Values = [val for (key, val) in Mydict]

或者只在需要时a[idx][1]提及idx Keys元素。

答案 1 :(得分:3)

目前您的断言似乎属实:

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

但迈克尔·奥格罗格解释说,这是一个无证实施的细节。

Stefan Karpinski评论 show(dict)现在按照#16743中的键排序:

  

这对于打印非常大的Dicts具有性能影响。我不认为这是个好主意。但是,我确实认为订购Dict是一个好主意,我们应该继续。

另见:

  • #10116 WIP:尝试订购Dict代表

最重要的是,你想做什么?也许你需要OrederedDict

答案 2 :(得分:2)

是的, foreach(var word in WordArray) <-- 1st time word is hello, second time it's bill { //Console.WriteLine(word); if (word.Equals("hello")) <- let's hello through, doesn't let bill through { Console.WriteLine(word); Thread.Sleep(1000); if (word.Contains("bill")) <--- bill never makes it here { Console.WriteLine("jarvis"); Thread.Sleep(1000); } } Thread.Sleep(1000); } keys按匹配顺序返回商品。除非像Dan Getz上面指出的那样,否则使用两个迭代器修改字典。

我认为字典没有这种行为是相对不正常的。对我们来说很明显,订单应该匹配,我们甚至不会在文档中明确提到这一点。

答案 3 :(得分:1)

确保键和值之间相应顺序的另一种方法是使用Iterators包中的imap,方法如下:

using Iterators
d = Dict(1=>'a',2=>'b',3=>'c')

# keys iterator is `imap(first,d)`
julia> collect(imap(first,d))
3-element Array{Any,1}:
 2
 3
 1

# values iterator is `imap(last,d)`
julia> collect(imap(last,d))
3-element Array{Any,1}:
 'b'
 'c'
 'a'

此方法可能适用于其他结构。所有其他评论和答案也都很好。