2017-07-29 81 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

而不是在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_id,ad_id對。

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

這會執行數據庫級別的工作,所以我期望它會比在Willem中提到的那樣快。

可能誤解了你的問題。請讓我知道如果是這樣的話,我可以嘗試提供一個替代解決方案。