Python集中的元素数量

时间:2010-03-27 07:23:28

标签: python comparison dataset

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

例如:

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

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

4 个答案:

答案 0 :(得分:9)

哪个客户的办公室有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)

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

答案 1 :(得分:1)

>>> 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
>>> 

即使您引用的数字很大,也应该非常有效。

答案 2 :(得分:1)

使用Python 2.7中的collections.Counter:

dialed_count = collections.Counter(nums_dialed)
count = sum(dialed_count[t] for t in client_nums)

答案 3 :(得分:0)

这是一种非常流行的方式,可以在单次传递中对某些排序列表进行组合:

nums_dialed = [1, 2, 2, 3, 3]
client_nums = [2,3]

nums_dialed.sort()
client_nums.sort()

c = 0
i = iter(nums_dialed)
j = iter(client_nums)
try:
    a = i.next()
    b = j.next()
    while True:
        if a < b:
            a = i.next()
            continue
        if a > b:
            b = j.next()
            continue
        # a == b
        c += 1
        a = i.next() # next dialed
except StopIteration:
    pass

print c

因为“set”是无序集合(不知道为什么它使用哈希值,而不是二叉树或排序列表)并且在那里使用它是不公平的。如果你喜欢列表,或者通过更复杂的东西生成有序的迭代器,你可以通过“bisect”实现自己的“set”。