0

次のハッシュを別のハッシュに変換します。

{["2013-08-15", "123", "user1"]=>1, ["2013-08-15", "456", "user1"]=>1, ["2013-08-09", "789", "user1"]=>5} 

上記のハッシュを次のように変換します

{["2013-08-15", "user1"]=>2, ["2013-08-09", "user1"]=>1} 

ご覧のとおり、ハッシュの最初と 2 番目のキーと値のペアは、同じ日付、異なるアカウント、同じユーザーを持っています。この場合、ユーザーの投稿の総数を 2 つとしてカウントする必要があります。{["2013-08-15", "user1"]=>2}

最後のキーと値のペアでは、5 件の投稿があるにもかかわらず、ユーザーが 1 つのアカウント (「789」) にのみ投稿したため、カウントは 1 になるはず{["2013-08-09", "user1"]=>1}です。

4

5 に答える 5

3

FacetsEnumerable#frequencyを使用すると、このクリーンでモジュール化されたワンライナーを記述できます。

require 'facets'
hash1 = {["2013-08-15", "123", "user1"] => 1, ...}
hash2 = hash1.keys.map { |date, code, user| [date, user] }.frequency
#=> {["2013-08-15", "user1"] => 2, ["2013-08-09", "user1"] => 1}

配列の値をアンパックすると、何が起こっているかを簡単に確認できることに注意してください。また、ファセットに依存する必要はなくEnumerable#frequency、拡張ライブラリに追加するだけでよいことに注意してください。これは非常に一般的な抽象化です。

于 2013-08-19T18:03:07.863 に答える
2

超エレガントではありませんが、機能します。また、ハッシュキーとして配列を使用するのはちょっと奇妙です。

h = {["2013-08-15", "123", "user1"]=>1, ["2013-08-15", "456", "user1"]=>1, ["2013-08-09", "789", "user1"]=>5}
h.inject(Hash.new(0)){|a,((date,post,user),v)| a[[date,user]] +=1; a } # => {["2013-08-15", "user1"]=>2, ["2013-08-09", "user1"]=>1}
于 2013-08-19T17:47:27.527 に答える
2
h = {["2013-08-15", "123", "user1"]=>1, ["2013-08-15", "456", "user1"]=>1, ["2013-08-09", "789","user1"]=>5} 
Hash[h.group_by{|k,v| k[0]}.map{|_,v| [v.flatten.values_at(0,2),v.size]}]
# => {["2013-08-15", "user1"]=>2, ["2013-08-09", "user1"]=>1}

または、

h = {["2013-08-15", "123", "user1"]=>1, ["2013-08-15", "456", "user1"]=>1, ["2013-08-09", "789","user1"]=>5} 
h.each_with_object(Hash.new(0)){|((d,_,u),_),hsh| hsh[[d,u]] +=1 }
# => {["2013-08-15", "user1"]=>2, ["2013-08-09", "user1"]=>1}
于 2013-08-19T17:47:48.257 に答える
1
  hash1 = {["2013-08-15", "123", "user1"]=>1, ["2013-08-15", "456", "user1"]=>1, ["2013-08-09", "789", "user1"]=>5} 

  hash2 = Hash.new
  hash1.each do |x,y|
      hash2[ [x[0],x[2]] ] = hash2[ [x[0],x[2]] ].to_i + 1
  end
  puts hash2

初めての初期化には .to_i メソッドを使用する必要があることに注意してください。それ以外の場合はnilで追加しますが、これにより 0 になります。

于 2013-08-19T17:48:11.773 に答える
1

これは と で行うことができgroup_byますmap:

h = {["2013-08-15", "123", "user1"]=>1, ["2013-08-15", "456", "user1"]=>1, ["2013-08-09", "789", "user1"]=>5}

Hash[h.group_by { |(u, _, d), _| [u, d] }.map { |u, d| [u, d.size] }]
#=> {["2013-08-15", "user1"]=>2, ["2013-08-09", "user1"]=>1}
于 2013-08-19T20:25:58.400 に答える