Python集中的元素数量

Tim*_*Tim 4 python comparison dataset

我有一个已拨打的电话号码列表(nums_dialed).我还有一组电话号码,这是客户办公室的电话号码(client_nums)我如何有效地计算出我拨打特定客户端的次数(总数)

例如:

>>>nums_dialed=[1,2,2,3,3]
>>>client_nums=set([2,3])
>>>???
total=4
Run Code Online (Sandbox Code Playgroud)

问题是我有一个大型的数据集:len(client_nums)~10 ^ 5; 和len(nums_dialed)~10 ^ 3.

nos*_*klo 10

哪个客户10^5在他办公室有号码?你是否为整个电话公司工作?

无论如何:

print sum(1 for num in nums_dialed if num in client_nums)
Run Code Online (Sandbox Code Playgroud)

这将为您提供尽可能快的数字.


如果要使用相同的nums_dialed列表为多个客户端执行此操作,则可以先在每个数字上缓存数据:

nums_dialed_dict = collections.defaultdict(int)
for num in nums_dialed:
    nums_dialed_dict[num] += 1
Run Code Online (Sandbox Code Playgroud)

然后在每个客户端上总结一下:

sum(nums_dialed_dict[num] for num in this_client_nums)
Run Code Online (Sandbox Code Playgroud)

这比为每个客户端再次遍历整个数字列表要快得多.

  • @ony:是的.如果`len`强制列表建立,那将是非常奇怪的.相反,它在python 2和3上的任何生成器上都有`TypeError`失败.包括python 2上的`itertools.imap`和`itertools.ifilter`,以及python 3上的`map`和`filter`.这项工作的合适工具. (2认同)