当应用于Dict
时,values(...)
和keys(...)
会按匹配顺序返回商品吗?
换句话说,zip(keys(d), values(d))
是否保证恰好包含字典d
的键值对?
答案 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是一个好主意,我们应该继续。
另见:
最重要的是,你想做什么?也许你需要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'
此方法可能适用于其他结构。所有其他评论和答案也都很好。