web-dev-qa-db-ja.com

Ruby配列で重複をカウントする方法

Ruby配列の重複をどのようにカウントしますか?

たとえば、私の配列に3つのaがある場合、それをどのように数えることができますか

33
user100051

これにより、重複する各要素の出現回数を含むハッシュとして、重複する要素が生成されます。コードに語らせましょう:

#!/usr/bin/env Ruby

class Array
  # monkey-patched version
  def dup_hash
    inject(Hash.new(0)) { |h,e| h[e] += 1; h }.select { 
      |k,v| v > 1 }.inject({}) { |r, e| r[e.first] = e.last; r }
  end
end

# unmonkeey'd
def dup_hash(ary)
  ary.inject(Hash.new(0)) { |h,e| h[e] += 1; h }.select { 
    |_k,v| v > 1 }.inject({}) { |r, e| r[e.first] = e.last; r }
end

p dup_hash([1, 2, "a", "a", 4, "a", 2, 1])
# {"a"=>3, 1=>2, 2=>2}

p [1, 2, "Thanks", "You're welcome", "Thanks", 
  "You're welcome", "Thanks", "You're welcome"].dup_hash
# {"You're welcome"=>3, "Thanks"=>3}
26
miku

配列の各要素のキーと各要素の数の値を含むハッシュの別のバージョン

a = [ 1, 2, 3, 3, 4, 3]
h = Hash.new(0)
a.each { | v | h.store(v, h[v]+1) }

# h = { 3=>3, 2=>1, 1=>1, 4=>1 } 
55
Kim

与えられた:

arr = [ 1, 2, 3, 2, 4, 5, 3]

要素を数える私のお気に入りの方法は:

counts = arr.group_by{|i| i}.map{|k,v| [k, v.count] }

# => [[1, 1], [2, 2], [3, 2], [4, 1], [5, 1]]

配列の代わりにハッシュが必要な場合:

Hash[*counts.flatten]

# => {1=>1, 2=>2, 3=>2, 4=>1, 5=>1}
33

シンプル。

arr = [2,3,4,3,2,67,2]
repeats = arr.length - arr.uniq.length
puts repeats
14
JRL
arr = %w( a b c d c b a )
# => ["a", "b", "c", "d", "c", "b", "a"]

arr.count('a')
# => 2
13
colllin

配列の重複をカウントする別の方法は次のとおりです。

arr= [2,2,3,3,2,4,2]

arr.group_by{|x| x}.map{|k,v| [k,v.count] }

結果は

[[2、4]、[3、2]、[4、1]]

11
Ganesh Shrivas

group_byには1.8.7以降が必要

ary = %w{a b c d a e f g a h i b}
ary.group_by{|elem| elem}.select{|key,val| val.length > 1}.map{|key,val| key}
# => ["a", "b"]

1.9以降では、Hash#selectがハッシュを返すため、これは少し単純化できます。

ary.group_by{|elem| elem}.select{|key,val| val.length > 1}.keys
# => ["a", "b"]
7
glenn jackman

単一の要素のインスタンスをカウントするには、injectを使用します

array.inject(0){|count,elem| elem == value ? count+1 : count}
3
Chris

組み込みのメソッドはないと思います。 total重複の数だけが必要な場合は、a.length-a.uniq.lengthを使用できます。単一の特定の要素の数を探している場合は、
a.select {|e| e == my_element}.length

2
Thom Smith

Grepはどうですか?

arr = [1, 2, "Thanks", "You're welcome", "Thanks", "You're welcome", "Thanks", "You're welcome"]

arr.grep('Thanks').size # => 3
2
fro_oo

@キムの答えを改善する:

arr = [1, 2, "a", "a", 4, "a", 2, 1]
Hash.new(0).tap { |h| arr.each { |v| h[v] += 1 } }
# => {1=>2, 2=>2, "a"=>3, 4=>1}
2

それは簡単です:

words = ["aa","bb","cc","bb","bb","cc"]

1行の簡単なソリューションは次のとおりです。

words.each_with_object(Hash.new(0)) { |Word,counts| counts[Word] += 1 }

わたしにはできる。

ありがとう!!

1

もう1つの方法は、each_with_objectを使用することです。

a = [ 1, 2, 3, 3, 4, 3]

hash = a.each_with_object({}) {|v, h|
  h[v] ||= 0
  h[v] += 1
}

# hash = { 3=>3, 2=>1, 1=>1, 4=>1 } 

このように、hash[5]などの存在しないキーを呼び出すと、0ではなくnilKim's solution で返されます。

1
pierrea

次のように、過去にこれにreduce/injectを使用しました

array = [1,5,4,3,1,5,6,8,8,8,9]
array.reduce (Hash.new(0)) {|counts, el| counts[el]+=1; counts}

作り出す

=> {1=>2, 5=>2, 4=>1, 3=>1, 6=>1, 8=>3, 9=>1}
0
rewolf

配列内の繰り返し要素を取得するRubyコード:

numbers = [1,2,3,1,2,0,8,9,0,1,2,3]
similar =  numbers.each_with_object([]) do |n, dups|
    dups << n if seen.include?(n)
    seen << n 
end
print "similar --> ", similar
0
sounish nath