我有一组有序的点(x,y对)我想用作字典中的键。
我在ruby中的原始方法是获得点的字符串表示,然后是SHA1结果。
在朱莉娅实现这一目标的最佳途径是什么?
编辑:
我想要创建的关键是点集,而不是集合中的各个点。
我有一个创建一组唯一整数点的过程,我想看看之前是否遇到过这个特定的点集。我还想存储一些关于这一特定点的信息。例如,我看过多少次此配置。
这组点的长度在20到180ish之间变化。
使用这些点的字符串表示的SHA1哈希,我知道无论点的长度如何,我的密钥都将是40个字符。
实际上,我使用SHA1来压缩我的密钥以保持字典的大小尽可能小。我希望这本词典能够发展到相当大的规模。
答案 0 :(得分:2)
你可以直接使用它们作为字典的键,例如
points = [(rand(),rand()) for i in 1:100]
a_dict = [p => rand(1:10000) for p in points]
@show points[1]
@show a_dict[points[1]]
产生
points[1] => (0.4374267407775083,0.32232663537074036)
a_dict[points[1]] => 4102
编辑:问题是询问点的列表而不是单对。很难从你的问题中看出来,但是如果你想丢掉点列表,那么我只使用hash
函数,这是字典使用的函数:
julia> x = [(rand(),rand()) for i in 1:100];
julia> y = copy(x);
julia> z = [(rand(),rand()) for i in 1:100];
julia> hash(x)
0x2dd258e3af0ec93a
julia> hash(y)
0x2dd258e3af0ec93a
julia> hash(z)
0x6449b750e42e6bc6
julia> some_dict = [hash(x) => 1, hash(z) => 1]
Dict{Uint64,Int64} with 2 entries:
0x6449b750e42e6bc6 => 1
0x2dd258e3af0ec93a => 1
julia> if hash(y) in keys(some_dict)
some_dict[hash(y)] += 1
else
some_dict[hash(y)] = 1
end
julia> some_dict
Dict{Uint64,Int64} with 2 entries:
0x6449b750e42e6bc6 => 1
0x2dd258e3af0ec93a => 2
如果您确实需要检索点集的内容,这似乎很可能,那么您可以直接使用字符集作为键,即
julia> other_dict = [x=>1,z=>1]
Dict{Array{(Float64,Float64),1},Int64} with 2 entries:
[(0.6453074757765922,0.0958215… => 1
[(0.5283378708792779,0.8418390… => 1
julia> other_dict[y] += 1
2
julia> other_dict
Dict{Array{(Float64,Float64),1},Int64} with 2 entries:
[(0.6453074757765922,0.0958215… => 1
[(0.5283378708792779,0.8418390… => 2
这个(使用可变键)在Julia中完全没问题(虽然如果你在添加字典后更改字典会发生不好的事情,当然)。