计算2个列表之间重复的最佳方法

时间:2017-03-12 10:56:34

标签: python optimization count duplicates

我看过一些帖子,内容涉及如何计算2个唯一列表中的重复项(列表中没有重复项)但不是如何为其他列表执行此操作的好方法,所以我自己想出了一些解决方案但是我怀疑他们是否得到了很好的优化。

我的第一个版本:

def version1(lst1,lst2):
    lst = list(set(lst1))
    return sum(min(lst1.count(lst[i]), lst2.count(lst[i])) for i in range(len(lst)))

第二版:

def version2(lst1,lst2):
    lst = [i for n,i in enumerate(lst1) if i not in lst1[:n]]
    return sum(min(lst1.count(lst[i]), lst2.count(lst[i])) for i in range(len(lst)))

第三版:

def version3(lst1,lst2):
    lst = list(dict.fromkeys(lst1).keys())
    return sum(min(lst1.count(lst[i]), lst2.count(lst[i])) for i in range(len(lst)))

速度测试:

import random

lst1 = [random.randint(0,101) for i in range(0,10000)]
lst2 = [random.randint(0,101) for i in range(0,10000)]

from timeit import default_timer as timer

print("first result:",end=" ")
START = timer()
print(version1(lst1,lst2))
END = timer()
print("first time:",END-START)

print("second result:", end=" ")
START = timer()
print(version2(lst1,lst2))
END = timer()
print("second time:",END-START)

print("third result:", end=" ")
START = timer()
print(version3(lst1,lst2))
END = timer()
print("third time:",END-START)

版本2的得分始终低于1和3,但版本1在列表中具有大量重复的列表得分更好,而列表本身内没有大量重复的列表则更好3。

我想知道是否有人知道更好的方法。

1 个答案:

答案 0 :(得分:4)

您可以使用支持&操作的collections.Counter

>>> from collections import Counter
>>> Counter([1,2,2,4]) & Counter([2,2,3,4]) # {2:2, 1:1, 4:1} AND {2:2, 3:1, 4:1}
Counter({2: 2, 4: 1})
>>> sum(_.values())
3
from collections import Counter
def another(lst1, lst2):
    return sum((Counter(lst1) & Counter(lst2)).values())

<强>更新

此处修改了version1。您不需要将set转换回list来使用索引访问项目;只需重复项目:

def version1_modified(lst1, lst2):
    return sum(min(lst1.count(x), lst2.count(x)) for x in set(lst1))