计算元组中唯一元组的发生率



对于一个分类广告的 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 次单独的点击。

性能也很重要 - 它是一个大型数据集 - 因此更喜欢最有效的解决方案,并附上一个说明性示例。

只需采用唯一的元组:

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( 常量时间操作(。

但是,如果此数据来自您的数据库,则要求为您提供唯一对会更有效。

请改用查询集上的distinct方法。假设您的模型User,并且您希望获得唯一的user_idad_id对。

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

这在数据库级别执行工作,所以我希望它比 Willem 提到的在 Python 中执行它更快。

可能误解了你的问题。如果是这种情况,请告诉我,以便我可以尝试提供替代解决方案。

最新更新