Ruby 按日期分组并减少数组以创建新数组

Ruby 按日期分组并减少数组以创建新数组,ruby,Ruby,我有这个阵列: > source # => [[Fri, 13 Mar 2015, [24.2]], [Tue, 17 Mar 2015, [0.01, 8.26]], [Mon, 16 Mar 2015, [0.01, 0.01, 0.01, 0.01]], [Mon, 16 Mar 2015, [0.01, 0.01]], [Fri, 13 Mar 2015, [24.2, 24.2, 24.2, 24.2, 24.2, 24.2, 24.2]], [Fri, 13

我有这个阵列:

> source

# =>
[[Fri, 13 Mar 2015, [24.2]],
 [Tue, 17 Mar 2015, [0.01, 8.26]],
 [Mon, 16 Mar 2015, [0.01, 0.01, 0.01, 0.01]],
 [Mon, 16 Mar 2015, [0.01, 0.01]],
 [Fri, 13 Mar 2015, [24.2, 24.2, 24.2, 24.2, 24.2, 24.2, 24.2]],
 [Fri, 13 Mar 2015, [24.2, 24.2, 24.2, 24.2, 24.2, 24.2, 24.2, 24.2, 24.2, 24.2]],
 [Mon, 16 Mar 2015, [15.95]],
 [Thu, 12 Mar 2015, [352429.0, 35242900.0, 3.0]]
]
我如何从中创建此项:

[
  [Thu, 12 Mar 2015, aaa]
  [Fri, 13 Mar 2015, bbb],
  [Mon, 16 Mar 2015, ccc],
  [Tue, 17 Mar 2015, ddd]
]
其中
aaa
bbb
。。。是具有相同日期的元素的总和。注意
[Thu,2015年3月12日,aaa]

是两个要素,而不是三个要素:
2015年3月12日
aaa

我尝试的是:

source.group_by { |x| x[0] }.reduce(0) # sum up all the element except the 1st one which is a date - how?

我建议如下

source = [
  ['Fri, 13 Mar 2015', [24.2]],
  ['Tue, 17 Mar 2015', [0.01, 8.26]],
  ['Mon, 16 Mar 2015', [0.01, 0.01, 0.01, 0.01]], 
  ['Mon, 16 Mar 2015', [0.01, 0.01]],
  ['Fri, 13 Mar 2015', [24.2, 24.2, 24.2, 24.2, 24.2, 24.2, 24.2]], 
  ['Fri, 13 Mar 2015', [24.2, 24.2, 24.2, 24.2, 24.2, 24.2, 24.2,
                        24.2, 24.2, 24.2]], 
  ['Mon, 16 Mar 2015', [15.95]],
  ['Thu, 12 Mar 2015', [352429.0, 35242900.0, 3.0]]
]

source.each_with_object({}) do |(d,a),h|
  h.update(d=>a.reduce(:+)) { |_,o,n| o+n }
end.to_a
  #=> [["Fri, 13 Mar 2015", 435.5999999999999],
  #    ["Tue, 17 Mar 2015", 8.27],
  #    ["Mon, 16 Mar 2015", 16.009999999999998],
  #    ["Thu, 12 Mar 2015", 35595332.0]] 
如果您希望将其作为散列(需要考虑的事项),只需将
删除到a

source.each_with_object({}) do |(d,a),h|
  h.update(d=>a.reduce(:+)) { |_,o,n| o+n }
end
  # => {"Fri, 13 Mar 2015"=>435.5999999999999,
  #    ...

这使用了(aka
merge!
)的形式,它使用一个块来解析合并的两个哈希中存在的键的值。

我建议如下

source = [
  ['Fri, 13 Mar 2015', [24.2]],
  ['Tue, 17 Mar 2015', [0.01, 8.26]],
  ['Mon, 16 Mar 2015', [0.01, 0.01, 0.01, 0.01]], 
  ['Mon, 16 Mar 2015', [0.01, 0.01]],
  ['Fri, 13 Mar 2015', [24.2, 24.2, 24.2, 24.2, 24.2, 24.2, 24.2]], 
  ['Fri, 13 Mar 2015', [24.2, 24.2, 24.2, 24.2, 24.2, 24.2, 24.2,
                        24.2, 24.2, 24.2]], 
  ['Mon, 16 Mar 2015', [15.95]],
  ['Thu, 12 Mar 2015', [352429.0, 35242900.0, 3.0]]
]

source.each_with_object({}) do |(d,a),h|
  h.update(d=>a.reduce(:+)) { |_,o,n| o+n }
end.to_a
  #=> [["Fri, 13 Mar 2015", 435.5999999999999],
  #    ["Tue, 17 Mar 2015", 8.27],
  #    ["Mon, 16 Mar 2015", 16.009999999999998],
  #    ["Thu, 12 Mar 2015", 35595332.0]] 
如果您希望将其作为散列(需要考虑的事项),只需将
删除到a

source.each_with_object({}) do |(d,a),h|
  h.update(d=>a.reduce(:+)) { |_,o,n| o+n }
end
  # => {"Fri, 13 Mar 2015"=>435.5999999999999,
  #    ...

这使用了(aka
merge!
)的形式,它使用一个块来解析合并的两个哈希中存在的键的值。

我建议如下

source = [
  ['Fri, 13 Mar 2015', [24.2]],
  ['Tue, 17 Mar 2015', [0.01, 8.26]],
  ['Mon, 16 Mar 2015', [0.01, 0.01, 0.01, 0.01]], 
  ['Mon, 16 Mar 2015', [0.01, 0.01]],
  ['Fri, 13 Mar 2015', [24.2, 24.2, 24.2, 24.2, 24.2, 24.2, 24.2]], 
  ['Fri, 13 Mar 2015', [24.2, 24.2, 24.2, 24.2, 24.2, 24.2, 24.2,
                        24.2, 24.2, 24.2]], 
  ['Mon, 16 Mar 2015', [15.95]],
  ['Thu, 12 Mar 2015', [352429.0, 35242900.0, 3.0]]
]

source.each_with_object({}) do |(d,a),h|
  h.update(d=>a.reduce(:+)) { |_,o,n| o+n }
end.to_a
  #=> [["Fri, 13 Mar 2015", 435.5999999999999],
  #    ["Tue, 17 Mar 2015", 8.27],
  #    ["Mon, 16 Mar 2015", 16.009999999999998],
  #    ["Thu, 12 Mar 2015", 35595332.0]] 
如果您希望将其作为散列(需要考虑的事项),只需将
删除到a

source.each_with_object({}) do |(d,a),h|
  h.update(d=>a.reduce(:+)) { |_,o,n| o+n }
end
  # => {"Fri, 13 Mar 2015"=>435.5999999999999,
  #    ...

这使用了(aka
merge!
)的形式,它使用一个块来解析合并的两个哈希中存在的键的值。

我建议如下

source = [
  ['Fri, 13 Mar 2015', [24.2]],
  ['Tue, 17 Mar 2015', [0.01, 8.26]],
  ['Mon, 16 Mar 2015', [0.01, 0.01, 0.01, 0.01]], 
  ['Mon, 16 Mar 2015', [0.01, 0.01]],
  ['Fri, 13 Mar 2015', [24.2, 24.2, 24.2, 24.2, 24.2, 24.2, 24.2]], 
  ['Fri, 13 Mar 2015', [24.2, 24.2, 24.2, 24.2, 24.2, 24.2, 24.2,
                        24.2, 24.2, 24.2]], 
  ['Mon, 16 Mar 2015', [15.95]],
  ['Thu, 12 Mar 2015', [352429.0, 35242900.0, 3.0]]
]

source.each_with_object({}) do |(d,a),h|
  h.update(d=>a.reduce(:+)) { |_,o,n| o+n }
end.to_a
  #=> [["Fri, 13 Mar 2015", 435.5999999999999],
  #    ["Tue, 17 Mar 2015", 8.27],
  #    ["Mon, 16 Mar 2015", 16.009999999999998],
  #    ["Thu, 12 Mar 2015", 35595332.0]] 
如果您希望将其作为散列(需要考虑的事项),只需将
删除到a

source.each_with_object({}) do |(d,a),h|
  h.update(d=>a.reduce(:+)) { |_,o,n| o+n }
end
  # => {"Fri, 13 Mar 2015"=>435.5999999999999,
  #    ...

这使用了(aka
merge!
)的形式,它使用一个块来解析合并的两个哈希中存在的键的值。

这是另一种方式,可能更容易阅读

source.group_by(&:first).map do |k,v|
  [k, v.flat_map(&:last).reduce(:+)]
end

这是另一种方式,可能更容易阅读

source.group_by(&:first).map do |k,v|
  [k, v.flat_map(&:last).reduce(:+)]
end

这是另一种方式,可能更容易阅读

source.group_by(&:first).map do |k,v|
  [k, v.flat_map(&:last).reduce(:+)]
end

这是另一种方式,可能更容易阅读

source.group_by(&:first).map do |k,v|
  [k, v.flat_map(&:last).reduce(:+)]
end

你需要把你所有的日期都加上引号。我建议您将“aaa”、“bbb”替换为示例中的实际金额,删除句子“注意……”,并为数据数组命名(例如,
source=[['Fri,2015年3月13日',[…
,这样那些提供答案的人可以在他们的代码中引用数组。你需要把你所有的日期都用引号引起来。我建议你将“aaa”、“bbb”替换为示例中的实际金额,删除句子“注意…”,并给数据数组一个名称(例如,
source=[['Fri,2015年3月13日',[…
,这样那些提供答案的人可以在他们的代码中引用数组。你需要把你所有的日期都用引号引起来。我建议你将“aaa”、“bbb”替换为示例中的实际金额,删除句子“注意…”,并给数据数组一个名称(例如,
source=[['Fri,2015年3月13日',[…
,这样那些提供答案的人可以在他们的代码中引用数组。你需要把你所有的日期都用引号引起来。我建议你将“aaa”、“bbb”替换为示例中的实际金额,删除句子“注意…”,并给数据数组一个名称(例如,
source=[['Fri,2015年3月13日',[…
,这样那些提供答案的人可以在他们的代码中引用数组。对于超过一行的块,你怎么用“{}”呢?我不明白你的问题。你能说得更具体一点吗?我的意思是“为什么”。Ruby的惯例是使用“do”对于多行块。哦,我明白了。对于多语句块,我使用
do…end
,但是对于单个语句(如此语句),我通常使用
{…}
,即使我将表达式格式化为显示在多行上。我可以在一行上编写此代码,但我认为这需要您水平滚动才能读取它(但可能不是),所以我写了两行,以便于阅读。(我讨厌水平滚动。)如果一个表达式很长,我会在37%的时间里使用
do…end
37%。你想得太多了。只需对多行表达式使用“do”,因为这是惯例。你使用“{}”对于占用多行的块?我不理解你的问题。你能说得更具体一点吗?我的意思是“为什么”。Ruby的惯例是对多行块使用“do”。哦,我明白了。我对多语句块使用
do…end
,但对单语句块(如本语句),我通常使用
{…}
,即使我将表达式的格式设置为显示在多行上。我本可以在一行上写这个,但我认为这需要您水平滚动才能读取它(但可能不是),所以我将它写在两行上以使其更易于阅读。(我讨厌水平滚动。)如果一个表达式真的很长,我会在37%的时间里使用
do…end
37。你想得太多了。只需对多行表达式使用“do”,因为这是惯例。对于占用多行的块,你怎么使用“{}”呢?我不明白你的问题。你能更具体一点吗?我的意思是“为什么”.Ruby的惯例是对多行块使用“do”。哦,我明白了。我对多语句块使用
do…end
,但对于单个语句(如此),我通常使用
{…}
,即使我将表达式的格式设置为显示在多行上。我本可以在一行上写这个,但我认为这需要您水平滚动才能读取它(但可能不是),所以我将它写在两行上以使其更易于阅读。(我讨厌水平滚动。)如果一个表达式真的很长,我会在37%的时间里使用
do…end
37。你想得太多了。只需对多行表达式使用“do”,因为这是惯例。对于占用多行的块,你怎么使用“{}”呢?我不明白你的问题。你能更具体一点吗?我的意思是“为什么”.Ruby的惯例是对多行块使用“do”。哦,我明白了。我对多语句块使用
do…end
,但对于单个语句(如此),我通常使用
{…}
,即使我将表达式的格式设置为显示在多行上。我本可以在一行上写这篇文章,但我认为这需要你水平滚动才能阅读它(但可能不是),所以我将它写在两行上,以便更容易阅读。(我讨厌水平滚动。)如果一个表达式真的