这个问题是this answer的延续。
下面我试图用真实的数据结构重现答案,但由于某种原因我得到了一个额外的数组,并且交换了元素。
问题
两个输出应该是相同的,所以任何人都可以看到我做错了吗?
这是正确的:
require 'pp'
a = {"A"=>1, "B"=>1, "C"=>1}
b = {"A"=>1, "B"=>1, "D"=>1, "E"=>1}
c = {"D"=>1, "E"=>1, "F"=>1}
keys = Hash.new { |hash, key| hash[key] = [] }
a.each_key { |k| keys[k] << :a }
b.each_key { |k| keys[k] << :b }
c.each_key { |k| keys[k] << :c }
pp keys
给出了
{"A"=>[:a, :b],
"B"=>[:a, :b],
"C"=>[:a],
"D"=>[:b, :c],
"E"=>[:b, :c],
"F"=>[:c]}
这是真正的数据结构,
groups = {
"a" => {"A"=>1, "B"=>1, "C"=>1},
"b" => {"A"=>1, "B"=>1, "D"=>1, "E"=>1},
"c" => {"D"=>1, "E"=>1, "F"=>1}
}
keys2 = Hash.new { |hash, key| hash[key] = [] }
groups.each { |k,v| keys2[k] << v.keys }
pp keys2
,它给出了错误的输出
{"a"=>[["A", "B", "C"]], "b"=>[["A", "B", "D", "E"]], "c"=>[["D", "E", "F"]]}
答案 0 :(得分:1)
额外阵列来自哪里?
下面。你自己推动它。
keys2[k] << v.keys
此外,这部分与您在第一部分中所做的不同。如果您要进行比较,请做正确的事。尽量减少差异。如果你做同样的事情(.each_key
等),结构将是相同的。
答案 1 :(得分:1)
由于你的最内层结构没有改变,each_key
部分应该几乎相同,即:
a.each_key { |k| keys[k] << :a }
但是a
现在引用了一个嵌套的哈希值,:a
引用了它的名称:
hash.each_key { |k| keys2[k] << name }
name
和hash
引用group
中的键和值:
groups = {
"a" => {"A"=>1, "B"=>1, "C"=>1},
# ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^
# name hash
(请注意,您可以选择任何变量名称,name
和hash
只是示例。)
全部放在一起:
require 'pp'
keys2 = Hash.new { |hash, key| hash[key] = [] }
groups.each do |name, hash|
hash.each_key { |k| keys2[k] << name }
end
pp keys2
输出:
{"A"=>["a", "b"],
"B"=>["a", "b"],
"C"=>["a"],
"D"=>["b", "c"],
"E"=>["b", "c"],
"F"=>["c"]}