删除具有不同哈希值的哈希哈希中的重复条目
Removing duplicate entries in a hash of hash with different hash values
hash_list = {
"a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
"b"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
"c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"},
"d"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"}
}
我期待如下结果,
{
"c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"},
"d"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"}
}
我怎样才能得到上面的结果?如果我这样做
hash_list.invert.invert
然后,我得到
{
"b"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
"c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"},
"d"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"}
}
在上面的结果中,其实不需要"b"
。我需要用 id 维护值。
我定义哈希 g
被哈希 h
支配 当且仅当 g[k] == h[k]
对于 [=12= 中的所有键](即,对于 g.keys
中的所有 k
)。此外,如果存在另一个键值对 kk=>hh
,则我将 hash_list
中的键值对 k=>h
定义为 dominated h
由散列 hh
.
支配
我假设要返回的散列仅包含来自 hash_list
的非支配键值对。使用此定义:
a
被删除,因为它由 b
(和 d
)和 支配
b
被移除,因为它被d
支配。
代码
def remove_dominated_values(hash)
hl = hash.dup
keys = hl.keys
key = keys.shift
while keys.any?
h = hl[key]
hkeys, hvalues = hl[key].keys, hl[key].values
hl.delete(key) if keys.any? { |k| hvalues == hl[k].values_at(*hkeys) }
key = keys.shift
end
hl
end
例子
hash_list = {
"a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
"b"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
"c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"},
"d"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"}
}
remove_dominated_values(hash_list)
#=> {"c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"},
# "d"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"}}
hash_list = {
"a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
"b"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
"c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"},
"d"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"}
}
我期待如下结果,
{
"c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"},
"d"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"}
}
我怎样才能得到上面的结果?如果我这样做
hash_list.invert.invert
然后,我得到
{
"b"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
"c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"},
"d"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"}
}
在上面的结果中,其实不需要"b"
。我需要用 id 维护值。
我定义哈希 g
被哈希 h
支配 当且仅当 g[k] == h[k]
对于 [=12= 中的所有键](即,对于 g.keys
中的所有 k
)。此外,如果存在另一个键值对 kk=>hh
,则我将 hash_list
中的键值对 k=>h
定义为 dominated h
由散列 hh
.
我假设要返回的散列仅包含来自 hash_list
的非支配键值对。使用此定义:
a
被删除,因为它由b
(和d
)和 支配
b
被移除,因为它被d
支配。
代码
def remove_dominated_values(hash)
hl = hash.dup
keys = hl.keys
key = keys.shift
while keys.any?
h = hl[key]
hkeys, hvalues = hl[key].keys, hl[key].values
hl.delete(key) if keys.any? { |k| hvalues == hl[k].values_at(*hkeys) }
key = keys.shift
end
hl
end
例子
hash_list = {
"a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
"b"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
"c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"},
"d"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"}
}
remove_dominated_values(hash_list)
#=> {"c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"},
# "d"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"}}