合并一系列哈希

时间:2016-10-17 13:59:59

标签: ruby

我有以下数组:

a=int(input('X= '))
b=int(input('Y= '))
c=int(input('C= '))
d=int(input('D= '))
e=int(input('E= '))
f=int(input('F= '))
j=a+b+c+d+e+f
numbers=[a,b,c,d,e,f] 
for i in (numbers):
    if i%2==1:
            m=j-i
            print(m-(m%10))
    elif i%2==0:
            m=j
            print(m-(m%10))

我需要

x = [ { a: [1,2] }, { a: [3,4] }, { a: [5,6] } ]

我尝试使用(除其他选项之外){ a: [[1,2], [3,4], [5,6]] }

merge

但不幸的是,我在结果周围得到了一个额外的数组。

有什么建议吗?

感谢

3 个答案:

答案 0 :(得分:4)

x.flat_map(&:to_a).group_by(&:first).map{ |k, v| [k, v.map(&:last)] }.to_h
#=> [{:a=>[[1, 2], [3, 4], [5, 6]]}]

答案 1 :(得分:1)

这可能不是获得预期结果的最有效方法,但你可以做到

h = Hash.new([])
x.each { |hash|
  hash.each { |key, values|
    h[key] = h[key] + [values]
  }
}

这样,最后h{:a=>[[1, 2], [3, 4], [5, 6]]}

答案 2 :(得分:1)

key = x.first.first.first
  #=> :a
{ key=>x.map { |h| h[key] } }
  #=> {:a=>[[1, 2], [3, 4], [5, 6]]}

请注意

a = x.first
  #=> {:a=>[1, 2]} 
b = a.first
  #=> [:a, [1, 2]] 
b.first
  #=> :a 

另一种方式:

a = x.map { |h| h.merge(h) { |_,v,_| [v] } }
  #=> [{:a=>[[1, 2]]}, {:a=>[[3, 4]]}, {:a=>[[5, 6]]}]
a.reduce { |t,h| t.merge(h) { |_,o,n| o+n } }
  #=> {:a=>[[1, 2], [3, 4], [5, 6]]}

这两个步骤都使用Hash#merge的形式,它使用一个块来确定合并的两个哈希中存在的键的值。有关详细信息,请参阅文档。

这两个步骤可以合并为一个如下:

x.reduce { |t,h| t.merge(h.merge(h) { |_,v,_| [v] })  { |_,o,n| o+n } }
  #=> {:a=>[1, 2, [3, 4], [5, 6]]}