Ruby 分组元素
Ruby grouping elements
我有数组:
a = [1, 3, 1, 3, 2, 1, 2]
而且我想按值分组,但将其保存为索引,因此结果必须如下所示:
[[0, 2, 5], [1, 3], [4, 6]]
或散列
{1=>[0, 2, 5], 3=>[1, 3], 2=>[4, 6]}
现在我使用的是非常难看的大代码:
struc = Struct.new(:index, :value)
array = array.map.with_index{ |v, i| struc.new(i, v) }.group_by {|s| s[1]}.map { |h| h[1].map { |e| e[0]}}
`
a = [1, 3, 1, 3, 2, 1, 2]
a.each_with_index.group_by(&:first).values.map { |h| h.map &:last }
首先我们得到 [val, idx], ...
形式的 Enumerator
(each_with_index
),然后 group_by
值(first
值对),然后取每对的索引(last
元素)。
您可以使用:
a = [1, 3, 1, 3, 2, 1, 2]
a.each_with_index.group_by(&:first).values.map { |b| b.transpose.last }
#=> [[0, 2, 5], [1, 3], [4, 6]]
如果您使用具有默认值的散列来避免对元素进行两次迭代:
a = [1, 3, 1, 3, 2, 1, 2]
Hash.new { |h, k| h[k] = [] }.tap do |result|
a.each_with_index { |i, n| result[i] << n }
end
#=> { 1 => [0, 2, 5], 3 => [1, 3], 2 => [4, 6] }
我有数组:
a = [1, 3, 1, 3, 2, 1, 2]
而且我想按值分组,但将其保存为索引,因此结果必须如下所示:
[[0, 2, 5], [1, 3], [4, 6]]
或散列
{1=>[0, 2, 5], 3=>[1, 3], 2=>[4, 6]}
现在我使用的是非常难看的大代码:
struc = Struct.new(:index, :value)
array = array.map.with_index{ |v, i| struc.new(i, v) }.group_by {|s| s[1]}.map { |h| h[1].map { |e| e[0]}}
`
a = [1, 3, 1, 3, 2, 1, 2]
a.each_with_index.group_by(&:first).values.map { |h| h.map &:last }
首先我们得到 [val, idx], ...
形式的 Enumerator
(each_with_index
),然后 group_by
值(first
值对),然后取每对的索引(last
元素)。
您可以使用:
a = [1, 3, 1, 3, 2, 1, 2]
a.each_with_index.group_by(&:first).values.map { |b| b.transpose.last }
#=> [[0, 2, 5], [1, 3], [4, 6]]
如果您使用具有默认值的散列来避免对元素进行两次迭代:
a = [1, 3, 1, 3, 2, 1, 2]
Hash.new { |h, k| h[k] = [] }.tap do |result|
a.each_with_index { |i, n| result[i] << n }
end
#=> { 1 => [0, 2, 5], 3 => [1, 3], 2 => [4, 6] }