使用哈希比较列表中的相似之处?

时间:2014-04-08 01:40:45

标签: python algorithm list

说你有一个清单:

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)次迭代可以得到高价。

我在想哈希可能就是这样,但我不确定。

但是如果有办法将列表最小化为一个字符串并将其与另一个字符串进行比较。

即H(L1)U H(L2)的x%是否共同?

请注意,我实际上不需要知道共同的项目是什么。只是他们在两者之间分享了一个百分比。 谢谢你提前。

2 个答案:

答案 0 :(得分:1)

如果您在两个列表中没有重复项,则可以使用集合,而不是在内部使用哈希 -

>>> L1 = {'milk', 'butter', 'bread', 'shampoo', 'dog food'}
>>> L2 = {'milk', 'butter', 'shampoo', 'dog food', 'coffee'}
>>> L1 & L2
{'dog food', 'butter', 'shampoo', 'milk'}

如果你需要处理重复项,那么Python有一个collections.Counter形式的多重集,并且它的交集操作可以达到预期的效果:

>>> from collections import Counter
>>> Counter(L1) & Counter(L2)
Counter({'butter': 1, 'milk': 1, 'shampoo': 1, 'dog food': 1})

获得共同的' x%'在字符串中,您需要将交集中的元素总数与您开始使用的元素数进行比较。以与列表相同的方式设置支持len(),因此如果您没有重复项,那么获取共同项目的数量只是len(L1 & L2)。取一个计数器的长度只会给你不同的元素的数量 - 当L1和L2是计数器时,要计算元素的数量达到它们的多重性,你可以这样做:

 common = L1 & L2
 num_in_common = sum(common.values())

答案 1 :(得分:0)

这就是设置如何工作。将列表转换为集合,您可以使用union / intersection

S1 = set(L1)
S2 = set(L2)
result = S1.intersection(S2)

这不会保留订单。