1

我有两个列表,如下所示:

a=['not','not','not','not']
b=['not','not']

我必须找到len包含上述两个列表交集的列表,结果是:

intersection=['not','not']
len(intersection)
2

现在的问题是我已经尝试过了filter(lambda x: x in a,b)filter (lambda x: x in b,a)但是当两个列表中的一个比另一个长时,我没有得到交叉点,而只是进行了成员资格检查。在上面的例子中,因为 a 的所有成员都在 b 中,所以我得到一个 len 的共同元素为 4;相反,我想要的是交集,即len2。 Usingset().intersection(set())将创建一个集合,这不是我想要的,因为所有元素都是相同的。您能给我建议任何有价值且紧凑的解决方案吗?

4

4 回答 4

1

如果您不介意使用collections.Counter,那么您可以有一个解决方案,例如

>>> import collections
>>> a=['not','not','not','not']
>>> b=['not','not']

>>> c1 = collections.Counter(a)
>>> c2 = collections.Counter(b)

然后按“不”索引

>>> c1['not'] + c2['not']
6

对于交叉口,您需要

>>> (c1 & c2) ['not']
2
于 2013-07-20T13:20:26.833 回答
0

set. 首先将这些列表制作成集合,然后取它们的交集。现在交叉路口可能有重复。因此,对于相交中的每个元素,在a和中取最小重复次数b

>>> a=['not','not','not','not']
>>> b=['not','not']
>>> def myIntersection(A,B):
...     setIn = set(A).intersection(set(B))
...     rt = []
...     for i in setIn:
...         for j in range(min(A.count(i),B.count(i))):
...             rt.append(i)
...     return rt
...
>>> myIntersection(a,b)
['not', 'not']
于 2013-07-20T13:16:31.423 回答
0

您是否考虑过以下方法?

a = ['not','not','not','not']
b = ['not','not']

min(len(a), len(b))
# 2

由于所有元素都相同,因此公共元素的数量只是两个列表长度中的最小值。

于 2013-07-20T13:21:20.577 回答
0

我没有看到任何特别紧凑的方法来计算它。让我们先寻求解决方案。

intersection是较短列表的一些子列表(例如b)。现在,为了在较短的列表不是非常短时获得更好的性能,请将较长的列表设为一个集合(例如set(a))。然后可以将交集表示为较短列表中的那些项目的列表理解,这些项目也在较长的集合中:

def common_elements(a, b):
    shorter, longer = (a, b) if len(a)<len(b) else (b, a)
    longer = set(longer)
    intersection = [item for item in shorter if item in longer]
    return intersection

a = ['not','not','not','not']
b = ['not','not']
print(common_elements(a,b))
于 2013-07-20T13:01:31.090 回答