Python集合中的元素数量

7 投票
5 回答
32826 浏览
提问于 2025-04-15 20:55

我有一个拨打过的电话号码列表(nums_dialed)。

还有一组电话号码,这些是客户办公室里的号码(client_nums)。

我想高效地计算我拨打某个特定客户的次数(total)。

举个例子:

>>>nums_dialed=[1,2,2,3,3]
>>>client_nums=set([2,3])
>>>???
total=4

问题是我有一个比较大的数据集:客户号码的数量大约是10万(len(client_nums) ~ 10^5),而拨打的号码数量大约是1000(len(nums_dialed) ~ 10^3)。

5 个回答

2

在Python 2.7中使用collections.Counter:

dialed_count = collections.Counter(nums_dialed)
count = sum(dialed_count[t] for t in client_nums)
2
>>> client_nums = set([2, 3])
>>> nums_dialed = [1, 2, 2, 3, 3]
>>> count = 0
>>> for num in nums_dialed:
...   if num in client_nums:
...     count += 1
... 
>>> count
4
>>> 

即使是你提到的大数字,这个方法也应该非常高效。

13

哪个客户的办公室里有 10^5 个号码?你是在为一家电话公司工作吗?

无论如何:

print sum(1 for num in nums_dialed if num in client_nums)

这样可以尽快得到号码。


如果你想为多个客户做这个,使用同一个 nums_dialed 列表,那么你可以先把每个号码的数据缓存起来:

nums_dialed_dict = collections.defaultdict(int)
for num in nums_dialed:
    nums_dialed_dict[num] += 1

然后只需要对每个客户的号码进行求和:

sum(nums_dialed_dict[num] for num in this_client_nums)

这样比每次都遍历整个号码列表要快很多。

撰写回答