Python集合中的元素数量
我有一个拨打过的电话号码列表(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)
这样比每次都遍历整个号码列表要快很多。