Ruby 将两个数组合并为哈希时保留重复键的键值对
我在ruby中有两个数组:Ruby 将两个数组合并为哈希时保留重复键的键值对,ruby,Ruby,我在ruby中有两个数组: array_one = ["farmer_joe", "farmer_judy", "farmer_crazy_eyes", "farmer_joe"] array_two = ["pigs", "chickens", "elephants", "cows"] 如果我使用zip函数,我会丢失重复值,Farmer Joe的密钥对 hash_one = Hash[array_one.zip array_two] => {"farmer_joe"=>"c
array_one = ["farmer_joe", "farmer_judy", "farmer_crazy_eyes", "farmer_joe"]
array_two = ["pigs", "chickens", "elephants", "cows"]
如果我使用zip函数,我会丢失重复值,Farmer Joe的密钥对
hash_one = Hash[array_one.zip array_two]
=> {"farmer_joe"=>"cows", "farmer_judy"=>"chickens", "farmer_crazy_eyes"=>"elephants"}
理想情况下,我想要一个函数,它允许我用一个漂亮的ruby风格的单线方法来克服这个问题。也许类似这样的东西会合并重复的键并将它们的值添加到数组中
hash_one = Hash[array_one.super_special_zip array_two]
=> {"farmer_joe"=>["pigs","cows"], "farmer_judy"=>["chickens"], "farmer_crazy_eyes"=>["elephants"]}
有没有这样的
super\u-special\u-zip
方法?或者说这是傻瓜的差事,有什么好的理由吗?有三种标准的方法
a1 = ["farmer_joe", "farmer_judy", "farmer_crazy_eyes", "farmer_joe"]
a2 = ["pigs", "chickens", "elephants", "cows"]
pairs = a1.zip(a2) # or [a1,a2].transpose
#=> [["farmer_joe", "pigs"], ["farmer_judy", "chickens"],
# ["farmer_crazy_eyes", "elephants"], ["farmer_joe", "cows"]]
1。用于创建默认值为空数组的哈希
pairs.each_with_object(Hash.new { |h,k| h[k]=[] }) { |(f,l),h| h[f] << l }
# => {"farmer_joe"=>["pigs", "cows"], "farmer_judy"=>["chickens"],
# "farmer_crazy_eyes"=>["elephants"]}
3。使用
除了最后两行,还有许多其他选择,其中一行是:
h.merge(h) { |*_,v| v.map(&:last) }
有三种标准方法可以做到这一点
a1 = ["farmer_joe", "farmer_judy", "farmer_crazy_eyes", "farmer_joe"]
a2 = ["pigs", "chickens", "elephants", "cows"]
pairs = a1.zip(a2) # or [a1,a2].transpose
#=> [["farmer_joe", "pigs"], ["farmer_judy", "chickens"],
# ["farmer_crazy_eyes", "elephants"], ["farmer_joe", "cows"]]
1。用于创建默认值为空数组的哈希
pairs.each_with_object(Hash.new { |h,k| h[k]=[] }) { |(f,l),h| h[f] << l }
# => {"farmer_joe"=>["pigs", "cows"], "farmer_judy"=>["chickens"],
# "farmer_crazy_eyes"=>["elephants"]}
3。使用
除了最后两行,还有许多其他选择,其中一行是:
h.merge(h) { |*_,v| v.map(&:last) }
一种方法
array_one = ["farmer_joe", "farmer_judy", "farmer_crazy_eyes", "farmer_joe"]
array_two = ["pigs", "chickens", "elephants", "cows"]
hash_one = {}
array_one.each_with_index do |farmer,i|
if hash_one.has_key?(farmer)
hash_one[farmer] << array_two[i]
else
hash_one[farmer] = [array_two[i]]
end
end
hash_one # => {"farmer_joe"=>["pigs", "cows"], "farmer_judy"=>["chickens"], "farmer_crazy_eyes"=>["elephants"]}
array\u one=[“farmer\u joe”、“farmer\u judy”、“farmer\u疯狂的眼睛”、“farmer\u joe”]
数组_two=[“猪”、“鸡”、“大象”、“牛”]
hash_one={}
数组_one.每个_带有_索引do | farmer,i|
如果散列一个。有密钥吗?(农民)
一个[农夫]{“农夫乔”=>[“猪”、“牛”],“农夫朱迪”=>[“鸡”],“农夫疯狂的眼睛”=>[“大象”]}
一种方法
array_one = ["farmer_joe", "farmer_judy", "farmer_crazy_eyes", "farmer_joe"]
array_two = ["pigs", "chickens", "elephants", "cows"]
hash_one = {}
array_one.each_with_index do |farmer,i|
if hash_one.has_key?(farmer)
hash_one[farmer] << array_two[i]
else
hash_one[farmer] = [array_two[i]]
end
end
hash_one # => {"farmer_joe"=>["pigs", "cows"], "farmer_judy"=>["chickens"], "farmer_crazy_eyes"=>["elephants"]}
array\u one=[“farmer\u joe”、“farmer\u judy”、“farmer\u疯狂的眼睛”、“farmer\u joe”]
数组_two=[“猪”、“鸡”、“大象”、“牛”]
hash_one={}
数组_one.每个_带有_索引do | farmer,i|
如果散列一个。有密钥吗?(农民)
一个[农夫]{“农夫乔”=>[“猪”、“牛”],“农夫朱迪”=>[“鸡”],“农夫疯狂的眼睛”=>[“大象”]}
另一种方法是(无导轨)
另一种方法是(无导轨)
array\u one.zip array\u two
不会丢失重复项,将结果转换为散列。array\u one.zip array\u two
不会丢失重复项,将结果转换为散列。与上面类似,我想说这更清楚一些,但我喜欢Cary的一行。如果我不能得到一个神奇的内置super\u special\u zip
方法,上述方法可能会很好地工作。非常感谢你的贡献!类似于上面,我想说这是一个更清楚,但我喜欢卡里的一行。如果我不能得到一个神奇的内置super\u special\u zip
方法,上述方法可能会很好地工作。非常感谢你的贡献!