Python:如果存在重复列表,如何找到两个列表的交集(实际上我需要一段交集长度)?

Python:如果存在重复列表,如何找到两个列表的交集(实际上我需要一段交集长度)?,python,Python,让我列出两份清单: a = ['a','b','c','a','a'] b = ['a','b','d'] 我需要计算Jaccard距离=(并集-相交)/并集,但我知道每个列表中都会有重复项,我想对它们进行计数,因此示例中的相交长度为2,Jaccard距离=(8-2)/8 我该怎么做?第一个想法是合并列表,然后逐个删除元素 更新: 也许我不得不强调更多,我需要数一数dublicates 这是我的工作解决方案,但它相当丑陋: a = [1,2,3,1,1] b = [2,1,1, 6,5] i

让我列出两份清单:

a = ['a','b','c','a','a']
b = ['a','b','d']
我需要计算Jaccard距离=(并集-相交)/并集,但我知道每个列表中都会有重复项,我想对它们进行计数,因此示例中的相交长度为2,Jaccard距离=(8-2)/8

我该怎么做?第一个想法是合并列表,然后逐个删除元素

更新: 也许我不得不强调更多,我需要数一数dublicates


这是我的工作解决方案,但它相当丑陋:

a = [1,2,3,1,1]
b = [2,1,1, 6,5]

import collections
aX = collections.Counter(a)
bX = collections.Counter(b)

r1 = [x for x in aX if x in bX]
print r1

print sum((min(aX[x], bX[x]) for x in r1))

>>> 3
a = [1,2,3,1,1]
b = [2,1,1, 6,5]

import collections
aX = collections.Counter(a)
bX = collections.Counter(b)

r1 = [x for x in aX if x in bX]
print r1

print sum((min(aX[x], bX[x]) for x in r1))

>>> 3
注释集将丢弃重复项

要获取两个列表a和b之间的数据:

def jaccard_distance(a,b):
    a = set(a)
    b = set(b)
    c = a.intersection(b)
    return float(len(a) + len(b) - len(c)) /(len(a) + len(b))

这是我的工作解决方案,但它相当丑陋:

a = [1,2,3,1,1]
b = [2,1,1, 6,5]

import collections
aX = collections.Counter(a)
bX = collections.Counter(b)

r1 = [x for x in aX if x in bX]
print r1

print sum((min(aX[x], bX[x]) for x in r1))

>>> 3
a = [1,2,3,1,1]
b = [2,1,1, 6,5]

import collections
aX = collections.Counter(a)
bX = collections.Counter(b)

r1 = [x for x in aX if x in bX]
print r1

print sum((min(aX[x], bX[x]) for x in r1))

>>> 3

在您的情况下,期望的输出是什么?你得到了什么样的输出?