假设你有一个清单:
L1 = [milk, butter, bread, shampoo, dog food]
你想知道这个列表和另一个列表有多相似
L2 = [milk, butter, shampoo, dog food, coffee]
这是两个列表的联合:
Result = L1 U L2
结果是
[Milk, butter, dog food]
现在,我知道我可以迭代这些并找到联合但是给定一个m大小的列表和一个n大小的列表,您将至少迭代min(n,m)次。给定x个列表,有x^min(n,m)个迭代可以得到pricy。
我在想散列可能是办法,但我不确定。
但是如果有一种方法可以将列表最小化为一个字符串,并将其与另一个字符串进行比较。
也就是说h(l1)uh(l2)有x%的共同点?
请注意,我其实不需要知道哪些项目是共同的。只是他们有一个百分比在两者之间分享。
提前谢谢。
最佳答案
如果两个列表中没有重复项,则可以使用集合,集合在内部使用散列-
>>> L1 = {'milk', 'butter', 'bread', 'shampoo', 'dog food'}
>>> L2 = {'milk', 'butter', 'shampoo', 'dog food', 'coffee'}
>>> L1 & L2
{'dog food', 'butter', 'shampoo', 'milk'}
如果您确实需要处理重复项,python有一个
collections.Counter
形式的multiset,它的交集操作执行您所期望的操作:>>> from collections import Counter
>>> Counter(L1) & Counter(L2)
Counter({'butter': 1, 'milk': 1, 'shampoo': 1, 'dog food': 1})
要获取“x%in common”字符串,需要将交叉点中的元素总数与开始时的元素数进行比较设置与列表支持
len()
的方式相同,因此,如果没有重复项,则获取公共项的数量只是len(L1 & L2)
计算计数器的长度只会给出不同元素的数量-要在l1和l2是计数器时将元素的数量计算到它们的多重性,可以执行以下操作: common = L1 & L2
num_in_common = sum(common.values())