Ruby配列の重複をどのように数えますか?
たとえば、配列に a が 3 つある場合、どうすればそれを数えることができますか?
配列内の各要素のキーと各要素の数の値を持つハッシュの別のバージョン
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 }
与えられた:
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}
これにより、各重複アイテムの出現回数を含むハッシュとして重複要素が生成されます。コードに話させてください:
#!/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}
単純。
arr = [2,3,4,3,2,67,2]
repeats = arr.length - arr.uniq.length
puts repeats
arr = %w( a b c d c b a )
# => ["a", "b", "c", "d", "c", "b", "a"]
arr.count('a')
# => 2
配列の重複をカウントする別の方法は次のとおりです。
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]]
には1.8.7+が必要ですgroup_by
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"]
単一要素のインスタンスをカウントするには、inject を使用します
array.inject(0){|count,elem| elem == value ? count+1 : count}
grepはどうですか?
arr = [1, 2, "Thanks", "You're welcome", "Thanks", "You're welcome", "Thanks", "You're welcome"]
arr.grep('Thanks').size # => 3
組み込みのメソッドはないと思います。重複の総数だけが必要な場合は、a.length - a.uniq.length を取ることができます。単一の特定の要素の数を探している場合は、 を試してください
a.select {|e| e == my_element}.length
。
それは簡単です:
words = ["aa","bb","cc","bb","bb","cc"]
1行の簡単な解決策は次のとおりです。
words.each_with_object(Hash.new(0)) { |word,counts| counts[word] += 1 }
わたしにはできる。
ありがとう!!
私は過去に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}