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操作(列表交集)?


当前回答

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

应该像做梦一样工作。并且,如果可以的话,使用集合而不是列表来避免所有这些类型更改!

其他回答

当我们使用tuple时,我们想要交叉

a=([1,2,3,4,5,20], [8,3,9,5,1,4,20])

for i in range(len(a)):

    b=set(a[i-1]).intersection(a[i])
print(b)
{1, 3, 4, 5, 20}

这里的大多数解决方案都不考虑列表中元素的顺序,而是将列表视为集合。另一方面,如果希望找到两个列表中包含的一个最长子序列,则可以尝试以下代码。

def intersect(a, b):
    if a == [] or b == []: 
        return []
    inter_1 = intersect(a[1:], b)
    if a[0] in b:
        idx = b.index(a[0])
        inter_2 = [a[0]] + intersect(a[1:], b[idx+1:])        
        if len(inter_1) <= len(inter_2):
            return inter_2
    return inter_1

对于a=[1,2,3]和b=[3,1,4,2],返回[1,2]而不是[1,2,3]。注意,这样的子序列不是唯一的,因为[1],[2],[3]都是a=[1,2,3]和b=[3,2,1]的解。

在这种情况下,你有一个列表的列表地图很方便:

>>> lists = [[1, 2, 3], [2, 3, 4], [2, 3, 5]]
>>> set(lists.pop()).intersection(*map(set, lists))
{2, 3}

适用于类似的迭代对象:

>>> lists = ['ash', 'nazg']
>>> set(lists.pop()).intersection(*map(set, lists))
{'a'}

如果列表是空的,Pop会爆炸,所以你可能想要在一个函数中进行包装:

def intersect_lists(lists):
    try:
        return set(lists.pop()).intersection(*map(set, lists))
    except IndexError: # pop from empty list
        return set()

这是一个示例,当您需要在结果中的每个元素出现的次数应该与它在两个数组中显示的次数相同。

def intersection(nums1, nums2):
    #example:
    #nums1 = [1,2,2,1]
    #nums2 = [2,2]
    #output = [2,2]
    #find first 2 and remove from target, continue iterating

    target, iterate = [nums1, nums2] if len(nums2) >= len(nums1) else [nums2, nums1] #iterate will look into target

    if len(target) == 0:
            return []

    i = 0
    store = []
    while i < len(iterate):

         element = iterate[i]

         if element in target:
               store.append(element)
               target.remove(element)

         i += 1


    return store

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

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