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
,但对于单个语句(如此),我通常使用{…}
,即使我将表达式的格式设置为显示在多行上。我本可以在一行上写这篇文章,但我认为这需要你水平滚动才能阅读它(但可能不是),所以我将它写在两行上,以便更容易阅读。(我讨厌水平滚动。)如果一个表达式真的