a = [1,2,3,4,5]
b = [1,3,5,6]
c = a and b
print c

实际输出:[1,3,5,6] 预期输出:[1,3,5]

如何在两个列表上实现布尔AND操作(列表交集)?


当前回答

如果顺序不重要,你不需要担心重复,那么你可以使用set intersection:

>>> a = [1,2,3,4,5]
>>> b = [1,3,5,6]
>>> list(set(a) & set(b))
[1, 3, 5]

其他回答

从较大的集合中创建一个集合:

_auxset = set(a)

然后,

c = [x for x in b if x in _auxset]

会做你想做的(保留b的顺序,而不是a的顺序——不一定能同时保留两者),而且动作要快。(使用a中的if x作为列表理解中的条件也可以工作,并且避免了构建_auxset的需要,但不幸的是,对于相当长的列表,它会慢得多)。

如果你想对结果进行排序,而不是保持列表的顺序,一个更整洁的方法可能是:

c = sorted(set(a).intersection(b))

对我来说,使用列表推导式是一个非常明显的方法。不确定性能如何,但至少能保持列表。

[x for x in a if x in b]

或者"所有在A中的x值,如果x值在B中"

如果你将两个列表中较大的一个转换为一个集合,你可以使用intersection()获得该集合与任何可迭代对象的交集:

a = [1,2,3,4,5]
b = [1,3,5,6]
set(a).intersection(b)

你也可以使用numpy.intersect1d(ar1, ar2)。 它返回两个数组中唯一且已排序的值。

如果布尔与是指同时出现在两个列表中的项,例如交集,那么你应该看看Python的set和frozenset类型。