如果两个单独的哈希中的键相等,则创建两个键值的交集。红宝石
我正在尝试创建 hash1 的值与 hash2 的值的交集(如果这些值共享相同的键)。到目前为止,这是我的代码。我能够生成两个哈希值 -->数据和数据1.
#!/usr/bin/env ruby
require 'pp'
require 'set'
data = {}
File.read(ARGV[0]).each do |l|
l.chomp!
key, value1, value2, value3, value4, value5, value6, value7, value8, value9, value10, value11, value12 = l.split(/\s+/)
data[key] ||= {}
values = [value1, value2, value3, value4, value5, value6, value7, value8, value9, value10, value11, value12]
data[key] = values.compact!
end
data1 = {}
File.read(ARGV[1]).each do |l|
l.chomp!
value = l.split(/\s+/)
data1[value[0]] ||= {}
data1[value[0]] = [value]
end
因此,我的主要目标是对于 hash1 中的每个键,仅保留 hash2 中相同键中也存在的那些值,否则从 hash1 中删除这些值。顺便说一句,我不关心 Hash2 中存在但 Hash1 中不存在的任何键。
我知道数组可以使用“&”相交和“设置”,尽管到目前为止我还无法在我的脚本中完成此操作。
任何建议都会很棒。谢谢。
对于西奥:
是的。
hash1 { alpha: [a,b,c,d,e], bravo: [f,g,h,i,j], charlie: [k,l,m,n,o], delta:[p,r ]}
hash2 { alpha: [a,c,q,z], bravo: [z,x], charlie: [k,l,m,n]}
所以,交集看起来像这样。
hash3 { alpha: [a,c], bravo:[nil], charlie: [k,l,m,n]}
I am trying to create an intersection of the values of hash1 with those of hash2, if those values share the same key. Here is my code so far. I am able to generate two hashes --> data and data1.
#!/usr/bin/env ruby
require 'pp'
require 'set'
data = {}
File.read(ARGV[0]).each do |l|
l.chomp!
key, value1, value2, value3, value4, value5, value6, value7, value8, value9, value10, value11, value12 = l.split(/\s+/)
data[key] ||= {}
values = [value1, value2, value3, value4, value5, value6, value7, value8, value9, value10, value11, value12]
data[key] = values.compact!
end
data1 = {}
File.read(ARGV[1]).each do |l|
l.chomp!
value = l.split(/\s+/)
data1[value[0]] ||= {}
data1[value[0]] = [value]
end
So, my main goal is for each key in hash1, keep only those values that also are present at that identical key in hash2, otherwise remove those values from hash1. I am not concerned with any keys present in Hash2 that are not present in Hash1, btw.
I know arrays can be intersected using "&" and "set", though I have not been able to accomplish this in my script so far.
Any advice would be great. Thanks.
For Theo:
Yes.
hash1 { alpha: [a,b,c,d,e], bravo: [f,g,h,i,j], charlie: [k,l,m,n,o], delta:[p,r]}
hash2 { alpha: [a,c,q,z], bravo: [z,x], charlie: [k,l,m,n]}
So, the intersection would look like this.
hash3 { alpha: [a,c], bravo:[nil], charlie: [k,l,m,n]}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
对于两个哈希值的常规交集,请执行以下操作:
但是您的情况有点不同。您可以使用以下代码获得您正在寻找的交集:
您的示例包括
:bravo =>; [nil]
,但我认为这是一个错误,因为nil
不是hash1
中:bravo
键之间的公共元素和hash2
,所以它没有意义。如果您想要hash1
和hash2
中的键的空列表,但其值列表中没有公共元素,您可以删除第三行,否则会删除这些元素。For a regular intersection of two hashes do:
But your case is a little bit different. You can get the intersection you are looking for with this code:
Your example includes
:bravo => [nil]
, but I think that is an error sincenil
is not a common element between the:bravo
key inhash1
andhash2
, so it doesn't make sense. If you want an empty list for keys that are inhash1
andhash2
but have no common elements in their value lists you can remove the third line, which otherwise removes those.此外,您首先检查 h1.keys 与 h2.keys 的大小进行比较,然后首先迭代较小的一个。它失去了上面的一些清晰度,但对于大小不同的较大散列来说,它会表现得更好。
Additionally, you check the size of h1.keys compared to h2.keys first and then iterate over the smaller one first. It loses a bit of the clarity of the above, but it will perform a lot better for larger hashes with a disparity in sizes.