检查一个散列是否包含另一个散列
Check that a hash includes another hash
鉴于我有一个散列数组 abc
和一个散列 ghi
:
abc = [{
'a' => '1',
'b' => '2',
'c' => '3',
'd' => '4'
}]
ghi = {
'a' => '1',
'b' => '2'
}
从 abc
中选择包含 ghi
中所有键值对的哈希的最干净、最有效的方法是什么?
我能做到这一点:
abc.map {|n| n.slice(*ghi.keys) == ghi }.all?
虽然看起来不是很干净
不确定这是否是最快的。
abc.select{|hash| (ghi.to_a - hash.to_a).empty?}
在Ruby 2.3.
abc.select{|h| h >= ghi}
注意:这是在 OP 提到 Ruby 版本之前回答的。
Ruby 的早期版本:
abc.select{|h| h.merge(ghi) == h}
对于所有键和值的检查,您可以尝试:
abc = [
{
'a' => '1',
'b' => '2',
'c' => '3',
'd' => '4'
},
{
'a' => '33',
'b' => '23'
}
]
d = {
'a' => '1',
'b' => '2'
}
abc.select{|hash| ((hash.values <=> d.values) == 1 ) && ((hash.keys <=> d.keys) == 1 )}
# => [{"a"=>"1", "b"=>"2", "c"=>"3", "d"=>"4"}]
abc.select{|h| ghi.all?{|k,v| h.key?(k) && h.value?(v) } }
基准测试结果:
require 'benchmark'
Benchmark.bm do |x|
x.report { 10000.times { abc.select{|h| ghi.all?{|k,v| h.key?(k) && h.value?(v) } } } }
x.report { 10000.times { abc.select{|h| h.merge(ghi) == h } } }
x.report { 10000.times { abc.select{|hash| (ghi.to_a - hash.to_a).empty? } } }
x.report { 10000.times { abc.select{|hash| (hash.values <=> ghi.values) == (hash.keys <=> ghi.keys) } } }
end
user system total real
0.040000 0.000000 0.040000 ( 0.037253)
0.040000 0.000000 0.040000 ( 0.046138)
0.150000 0.000000 0.150000 ( 0.155893)
0.020000 0.000000 0.020000 ( 0.028176)
看起来 Rajarshi 的答案是所有答案中效率最高的。
鉴于我有一个散列数组 abc
和一个散列 ghi
:
abc = [{
'a' => '1',
'b' => '2',
'c' => '3',
'd' => '4'
}]
ghi = {
'a' => '1',
'b' => '2'
}
从 abc
中选择包含 ghi
中所有键值对的哈希的最干净、最有效的方法是什么?
我能做到这一点:
abc.map {|n| n.slice(*ghi.keys) == ghi }.all?
虽然看起来不是很干净
不确定这是否是最快的。
abc.select{|hash| (ghi.to_a - hash.to_a).empty?}
在Ruby 2.3.
abc.select{|h| h >= ghi}
注意:这是在 OP 提到 Ruby 版本之前回答的。
Ruby 的早期版本:
abc.select{|h| h.merge(ghi) == h}
对于所有键和值的检查,您可以尝试:
abc = [
{
'a' => '1',
'b' => '2',
'c' => '3',
'd' => '4'
},
{
'a' => '33',
'b' => '23'
}
]
d = {
'a' => '1',
'b' => '2'
}
abc.select{|hash| ((hash.values <=> d.values) == 1 ) && ((hash.keys <=> d.keys) == 1 )}
# => [{"a"=>"1", "b"=>"2", "c"=>"3", "d"=>"4"}]
abc.select{|h| ghi.all?{|k,v| h.key?(k) && h.value?(v) } }
基准测试结果:
require 'benchmark'
Benchmark.bm do |x|
x.report { 10000.times { abc.select{|h| ghi.all?{|k,v| h.key?(k) && h.value?(v) } } } }
x.report { 10000.times { abc.select{|h| h.merge(ghi) == h } } }
x.report { 10000.times { abc.select{|hash| (ghi.to_a - hash.to_a).empty? } } }
x.report { 10000.times { abc.select{|hash| (hash.values <=> ghi.values) == (hash.keys <=> ghi.keys) } } }
end
user system total real
0.040000 0.000000 0.040000 ( 0.037253)
0.040000 0.000000 0.040000 ( 0.046138)
0.150000 0.000000 0.150000 ( 0.155893)
0.020000 0.000000 0.020000 ( 0.028176)
看起来 Rajarshi 的答案是所有答案中效率最高的。