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

时间:2015-09-24 14:59:47

标签: python

让我有两个清单:

a = ['a','b','c','a','a']
b = ['a','b','d']

我需要计算Jaccard距离=(union-intersect)/ union,但我知道每个列表中都会有重复项,我想计算它们,所以例如相对长度为2且Jaccard距离=( 8-2)/ 8

我该怎么做?首先想到的是联合列表,然后逐个删除元素......

更新: 可能我不得不更加强调我需要计算一些共和党人;

这是我的工作解决方案,但它非常难看:

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

4 个答案:

答案 0 :(得分:1)

a = ['a','b','c','a','a']
b = ['a','b','d']
c = list(set(b).intersection(a))
['a','b']

注意事项会丢弃重复项!

答案 1 :(得分:1)

获取两个列表a和b之间的jaccard index

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

答案 2 :(得分:0)

使用集而不是列表。

set_a = set(a)
#Intersection will be
intersection = len(set_a.intersection(b))
#Union will be
union = len(set_a.union(b))

jackards_distance =  (union-intersect)/union

请注意,使用sets时,会丢弃每个副本。因此,联合长度将是4而不是8.如果要计算包括重复项在内的所有元素,则应该使用集合来计算联合,而不是求和len(a)+ len(b)

答案 3 :(得分:0)

这是我的工作解决方案,但它非常难看:

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