Arrays Ruby——通过键值在数组中添加子数组的值
所以我知道如何在数组中添加所有值 例如,[1,2,3,4]之和Arrays Ruby——通过键值在数组中添加子数组的值,arrays,ruby,Arrays,Ruby,所以我知道如何在数组中添加所有值 例如,[1,2,3,4]之和 [1,2,3,4].inject(&:+) #=> 10 但是,我有一个数组数组,并且希望添加具有每个子数组的相同第一个元素的值 # example [["A", 10],["A", 5],["B", 5],["B", 5],["C", 15], ["C", 15]] 期望输出: 任何帮助都将不胜感激 a = [["A", 10],["A", 5],["B", 5],["B", 5],["C", 15], ["C
[1,2,3,4].inject(&:+)
#=> 10
但是,我有一个数组数组,并且希望添加具有每个子数组的相同第一个元素的值
# example
[["A", 10],["A", 5],["B", 5],["B", 5],["C", 15], ["C", 15]]
期望输出:
任何帮助都将不胜感激
a = [["A", 10],["A", 5],["B", 5],["B", 5],["C", 15], ["C", 15]]
result = a.group_by(&:first).each_with_object({}) do |(k, v), h|
h[k] = v.map(&:last).inject(:+)
# if your on Ruby 2.4+ you can write h[k] = v.sum(&:last)
end
#=> {"A"=>15, "B"=>10, "C"=>30}
另一种选择是从头构建哈希:
result = a.each_with_object({}) {|(k, v), h| h[k] = h[k].to_i + v }
#=> {"A"=>15, "B"=>10, "C"=>30}
如果您想要的输出是一个字符串“(a:15)-(B:10)-(C:30)”
:
然后
您可以这样组合:
arr.each_with_object(Hash.new(0)) { |(f,g),h| h[f] += g }.
map { |pair| "(%s : %s)" % pair }.join(" - ")
请参阅,特别是关于默认值的使用(此处为0
)。试试这个
arr = [["A", 10],["A", 5],["B", 5],["B", 5],["C", 15], ["C", 15]]
arr.group_by(&:first).map { |key, group| [key, group.map(&:last).inject(:+)] }
# => [["A", 15], ["B", 10], ["C", 30]]
这是怎么回事
按第一个元素对子阵列进行分组groupby(&:first)
转换组map{| key,group |…}
汇总组中最后的所有元素group.map(&:last).inject(:+)
默认值
0
比我的解决方案更干净,检查是否存在密钥-像往常一样,很好!在2.4.0中,我们也可以这样使用sum
:group.sum(&:last)。如果您是第一个例子,在2.4.0中,我们也可以使用h[k]=v.sum(&:last)
@sagarpandya82是的,我知道有人会提出它:)编辑:)
arr = [["A", 10],["A", 5],["B", 5],["B", 5],["C", 15], ["C", 15]]
h = arr.each_with_object(Hash.new(0)) { |(f,g),h| h[f] += g }
#=> {"A"=>15, "B"=>10, "C"=>30}
h.map { |pair| "(%s : %s)" % pair }.join(" - ")
#=> "(A : 15) - (B : 10) - (C : 30)"
arr.each_with_object(Hash.new(0)) { |(f,g),h| h[f] += g }.
map { |pair| "(%s : %s)" % pair }.join(" - ")
arr = [["A", 10],["A", 5],["B", 5],["B", 5],["C", 15], ["C", 15]]
arr.group_by(&:first).map { |key, group| [key, group.map(&:last).inject(:+)] }
# => [["A", 15], ["B", 10], ["C", 30]]
my_array = [["A", 10],["A", 5],["B", 5],["B", 5],["C", 15],["C", 15]]
my_hash = {}
output_array = []
my_array.each do |item|
my_hash[item[0]] ||= 0
my_hash[item[0]] += item[1]
end
my_hash.each do |k,v|
output_array.push("(#{k} : #{v})")
end
puts output_array.join(" - ")