计算数组中不同的元素
Counting the distinct elements in an array
我有一个数组:
a = [1, 2, 3, 3, 6, 8, 1, 9]
我想像这样显示每个唯一元素值及其关联的元素计数:
1: 2
2: 1
3: 2
6: 1
8: 1
9: 1
到目前为止我有:
a.sort.group_by { |x| x }
{
1 => [
[0] 1,
[1] 1
],
2 => [
[0] 2
],
3 => [
[0] 3,
[1] 3
],
6 => [
[0] 6
],
8 => [
[0] 8
],
9 => [
[0] 9
]
}
所以Hash的每个元素都包含一个数组。我可以使用该数组的计数得到我的答案,但我无法弄清楚如何简洁地处理散列。
这是一个可怕的实现吗?
a.sort.group_by { |x| x }.each {|x| puts "#{x[0]} #{x[1].count}" }
怎么样:
a.inject({}) { |a,e| a[e] = (a[e] || 0) + 1; a }
=> {1=>2, 2=>1, 3=>2, 6=>1, 8=>1, 9=>1}
例如:
h = a.inject({}) { |a,e| a[e] = (a[e] || 0) + 1; a }
=> {1=>2, 2=>1, 3=>2, 6=>1, 8=>1, 9=>1}
h.keys.sort.each { |k| puts "#{k}: #{h[k]}" }
1: 2
2: 1
3: 2
6: 1
8: 1
9: 1
来自以下其他人的评论:
a.each_with_object(Hash.new(0)) { |e,a| a[e] += 1 }
=> {1=>2, 2=>1, 3=>2, 6=>1, 8=>1, 9=>1}
使用 uniq
获取唯一的数组值,使用 sort
将它们按升序排序。然后对于这些值中的每一个 x
,显示 a.count(x)
.
a = [1, 2, 3, 3, 6, 8, 1, 9]
a.uniq.sort.each {|x| puts '%d: %d' % [x, a.count(x)] }
为了提高效率,创建一个散列,将一个值映射到它在数组中出现的次数。一种简单的方法是初始化一个 Hash 对象,该对象默认将键映射到零。然后,您可以在遍历数组时将每个值的计数加一。
counts = Hash.new(0)
a.each {|x| counts[x] += 1 }
counts.keys.sort.each {|x| puts '%d: %d' % [x, counts[x]] }
考虑一下:
a = [1, 2, 3, 3, 6, 8, 1, 9]
a.group_by{ |n| n } # => {1=>[1, 1], 2=>[2], 3=>[3, 3], 6=>[6], 8=>[8], 9=>[9]}
a.group_by{ |n| n }.map{ |k, v| [k, v.size ] } # => [[1, 2], [2, 1], [3, 2], [6, 1], [8, 1], [9, 1]]
最后:
a.group_by{ |n| n }.map{ |k, v| [k, v.size ] }.to_h # => {1=>2, 2=>1, 3=>2, 6=>1, 8=>1, 9=>1}
试试这个
module Enumerable
def freq
hash = Hash.new(0)
each { |each| hash[each] += 1 }
hash
end
end
然后
[1, 2, 3, 3, 6, 8, 1, 9].freq
# => {1=>2, 2=>1, 3=>2, 6=>1, 8=>1, 9=>1}
我有一个数组:
a = [1, 2, 3, 3, 6, 8, 1, 9]
我想像这样显示每个唯一元素值及其关联的元素计数:
1: 2
2: 1
3: 2
6: 1
8: 1
9: 1
到目前为止我有:
a.sort.group_by { |x| x }
{
1 => [
[0] 1,
[1] 1
],
2 => [
[0] 2
],
3 => [
[0] 3,
[1] 3
],
6 => [
[0] 6
],
8 => [
[0] 8
],
9 => [
[0] 9
]
}
所以Hash的每个元素都包含一个数组。我可以使用该数组的计数得到我的答案,但我无法弄清楚如何简洁地处理散列。
这是一个可怕的实现吗?
a.sort.group_by { |x| x }.each {|x| puts "#{x[0]} #{x[1].count}" }
怎么样:
a.inject({}) { |a,e| a[e] = (a[e] || 0) + 1; a }
=> {1=>2, 2=>1, 3=>2, 6=>1, 8=>1, 9=>1}
例如:
h = a.inject({}) { |a,e| a[e] = (a[e] || 0) + 1; a }
=> {1=>2, 2=>1, 3=>2, 6=>1, 8=>1, 9=>1}
h.keys.sort.each { |k| puts "#{k}: #{h[k]}" }
1: 2
2: 1
3: 2
6: 1
8: 1
9: 1
来自以下其他人的评论:
a.each_with_object(Hash.new(0)) { |e,a| a[e] += 1 }
=> {1=>2, 2=>1, 3=>2, 6=>1, 8=>1, 9=>1}
使用 uniq
获取唯一的数组值,使用 sort
将它们按升序排序。然后对于这些值中的每一个 x
,显示 a.count(x)
.
a = [1, 2, 3, 3, 6, 8, 1, 9]
a.uniq.sort.each {|x| puts '%d: %d' % [x, a.count(x)] }
为了提高效率,创建一个散列,将一个值映射到它在数组中出现的次数。一种简单的方法是初始化一个 Hash 对象,该对象默认将键映射到零。然后,您可以在遍历数组时将每个值的计数加一。
counts = Hash.new(0)
a.each {|x| counts[x] += 1 }
counts.keys.sort.each {|x| puts '%d: %d' % [x, counts[x]] }
考虑一下:
a = [1, 2, 3, 3, 6, 8, 1, 9]
a.group_by{ |n| n } # => {1=>[1, 1], 2=>[2], 3=>[3, 3], 6=>[6], 8=>[8], 9=>[9]}
a.group_by{ |n| n }.map{ |k, v| [k, v.size ] } # => [[1, 2], [2, 1], [3, 2], [6, 1], [8, 1], [9, 1]]
最后:
a.group_by{ |n| n }.map{ |k, v| [k, v.size ] }.to_h # => {1=>2, 2=>1, 3=>2, 6=>1, 8=>1, 9=>1}
试试这个
module Enumerable
def freq
hash = Hash.new(0)
each { |each| hash[each] += 1 }
hash
end
end
然后
[1, 2, 3, 3, 6, 8, 1, 9].freq
# => {1=>2, 2=>1, 3=>2, 6=>1, 8=>1, 9=>1}