Ruby合并哈希将键放入CSV字符串

3
有没有一种聪明的方法在Ruby中实现以下内容?
hash1 = { "a" => 1, "b" => 2, "d" => 3}
hash2 = { "a" => 4, "b" => 5, "c" => 7}
hash3 = { "a" => 4, "d" => 7, "e" => 9}
puts hash1.csvMerge(hash2).csvMerge(hash3)

输出结果为:
{ "a" => "1,4,4",
  "b" => "2,5,0",
  "c" => "0,7,0",
  "d" => "3,0,7",
  "e" => "0,0,9" }

我想要做的是将一堆Ruby哈希表合并成一个单独的哈希表,其中值组合成逗号分隔的字符串。实际上,我有超过十二个哈希表需要合并。

5个回答

2
hash1.merge(hash2){|key, oldval, newval| [oldval,newval].join(",")}
 => {"a"=>"1,4", "b"=>"2,5", "d"=>3, "c"=>7} 

1
那个几乎可以工作,但是有没有办法处理哈希表1中不存在于哈希表2中的键的情况? - sipsorcery

1
hashes = [hash1, hash2, hash3]
keys = hashes.inject({}){|hh, h| hh = hh.merge(h); hh}.keys   # the set of all keys #
default_hash = keys.inject({}){|d, k| d[k] = 0; d}    # hash with value 0 for all keys #
complemented_hashes = hashes.map{|h| default_hash.merge(h)} # missing values filled in #

p Hash[complemented_hashes.map{|h| h.to_a}.flatten(1).group_by{|k, v| k}.
map{|k, v| [k, v.map{|k, v| v}.join(",")]}]

1

我不知道这是否有性能问题。

hashes = [hash1, hash2, hash3]
hash_with_all_keys = {}
hashes.each{|hash| hash_with_all_keys.merge!(hash)}
keys = hash_with_all_keys.keys
result_hash_mapping = keys.map do |key|
  value = hashes.map{|hash| hash[key].to_i}.join(",")
  [key, value]
end
result_hash = Hash[result_hash_mapping]

我本可以用keys = hashes.inject({}){|merge_hash, hash| merge_hash.merge(hash)}.keys来替换第2到4行,但我觉得这样写很难读懂。


1
hash1 = { "a" => 1, "b" => 2, "d" => 3}
hash2 = { "a" => 4, "b" => 5, "c" => 7}
hash3 = { "a" => 4, "d" => 7, "e" => 9}

hashes = [hash1, hash2, hash3]
hashes.each{|h| h.each{|k,v| h[k] = v.to_s }}
res = hashes.inject{|m,h| m.merge(h){|k,old,new| "#{old},#{new}" }} #merge and glue

p res
#=> {"a"=>"1,4,4", "b"=>"2,5", "d"=>"3,7", "c"=>"7", "e"=>"9"}

1

函数式编程方法:

hashes = [hash1, hash2, hash3]
result = Hash[hashes.flat_map(&:keys).uniq.map do |key|
  [key, hashes.map { |h| h[key] || 0 }.join(",")]
end]
#=> {"a"=>"1,4,4", "b"=>"2,5,0", "c"=>"0,7,0", "d"=>"3,0,7", "e"=>"0,0,9"}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接