2017-07-29 6 views
0

Djangoのウェブサイトプロジェクトでは、(user_id, ad_id)のタプルのリストがあります。これは、クリッカーのuser_idと関連するad_idを示します。例えばタプルリスト内のユニークなタプルの発生率の計算

gross_clicks = [(1, 13),(1, 12), (1, 13), (2, 45), (2, 13), (1, 15), ...(n, m)] 

このリスト内の要素が無いことであるが独特の意味 - 各クリックは関係なく、同じユーザによってだ、および/またはそれが同じ広告上にあるかどうかのこのリストにプッシュされます。

今、私は実行して、すべてのユニークなクリックを得ることができます。

unique_clicks = [] 
import operator 
gross_click_ids = map(operator.itemgetter(0), gross_clicks) 
return len(set(gross_click_ids)) 

をしかし、どのように、私は広告あたりユニーククリックを得るのですか?私。同じユーザーが2つの異なる広告をクリックした場合、2つの別々のクリックとしてカウントされます。

パフォーマンス上の問題もあります。データが大きいため、最も効率的なソリューションと、実例があります。

+2

これをPythonで行うのではなく、データベースレベルで行うのはどうですか?おそらくもっと速いでしょう。 –

+0

私は同じ考えをしていた。それも簡単になります。 –

+0

@WillemVanOnsem:私のバックエンドは 'Redis'です –

答えて

0

だけのユニークなタプルを取る:

unique_clicks = set(gross_clicks) 

これはあなたの広告ごとに固有のユーザーインプレッションのセットを提供します。あなたのサンプル入力で

(1, 13)が二回表示されますが、セットで、それは一度だけ表示されます:

ユニークな要素を追跡するためのセットを使用し
>>> gross_clicks = [(1, 13), (1, 12), (1, 13), (2, 45), (2, 13), (1, 15)] 
>>> set(gross_clicks) 
{(1, 12), (1, 13), (1, 15), (2, 45), (2, 13)} 

はタプルの大規模なリスト与えられ、それが得ることができる限り効率的です指定されたタプルが既にセット内にあるかどうかをテストすることは、O(1)一定時間オペレーションである。

ただし、このデータがデータベースからのものである場合は、代わりにを入力すると効率的です。

0

代わりにクエリーセットでdistinctメソッドを使用してください。あなたのモデルがUserで、ユニークなuser_idad_idのペアを取得したいとします。

User.objects.all().values_list('id', 'ad_id').distinct('id', 'ad_id') 

これはデータベースレベルでの作業を実行するため、私はWillemが指摘したようにPythonで実行するよりも速いと予想しています。

I あなたの質問に誤解があります。そうであれば私に教えてください。そうすれば、私は別の解決法を提供しようとすることができます。

関連する問題