Python | 检查两个列表中是否至少有一个共同元素

给出两个列表a,b。检查两个列表中是否至少有一个共同的元素。

例如

Input : a = [1, 2, 3, 4, 5]
b = [5, 6, 7, 8, 9]
Output : True

Input : a=[1, 2, 3, 4, 5]
b=[6, 7, 8, 9]
Output : False

方法1:遍历列表

遍历两个列表,我们可以检查它们是否至少存在一个公共元素。在遍历两个列表时,如果我们发现其中有一个元素是公共的,那么我们返回true。完成遍历和检查后,如果没有相同的元素,则返回false。

def common_data(list1, list2):
    result = False
 
    # traverse in the 1st list
    for x in list1:
 
        # traverse in the 2nd list
        for y in list2:
   
            # if one common
            if x == y:
                result = True
                return result
                 
    return result
     
# driver code
a = [1, 2, 3, 4, 5]
b = [5, 6, 7, 8, 9]
print(common_data(a, b))
 
a = [1, 2, 3, 4, 5]
b = [6, 7, 8, 9]
print(common_data(a, b))

输出

True 
False

时间复杂度:O(n*m),其中n和m是输入列表的长度。
空间复杂度:O(1)。

方法2:使用集合属性

使用set的and属性,如果至少存在一个公共元素,则set(a)& set(B)返回一个正整数,如果不包含任何正整数,则返回0。因此,我们在set_a中插入a,在set_b中插入B,然后检查set_a和set_b是否为正整数。

def common_member(a, b):
    a_set = set(a)
    b_set = set(b)
    if (a_set & b_set):
        return True
    else:
        return False
         
 
a = [1, 2, 3, 4, 5]
b = [5, 6, 7, 8, 9]
print(common_member(a, b))
 
a =[1, 2, 3, 4, 5]
b =[6, 7, 8, 9]
print(common_member(a, b))

输出

True 
False

时间复杂度:O(m + n),其中m和n分别是输入列表a和b的长度。
空间复杂度:O(m + n)。

方法3:使用集合交集

使用集合的交集函数。a_set.intersection(b_set)如果至少有一个元素是公共的,则返回正整数,否则返回0。因此,我们在set_a中插入a,在set_b中插入b,然后检查a_set.intersection(b_set),并根据值返回。

def common_member(a, b):
    a_set = set(a)
    b_set = set(b)
    if len(a_set.intersection(b_set)) > 0:
        return(True)
    return(False)  
 
a = [1, 2, 3, 4, 5]
b = [5, 6, 7, 8, 9]
print(common_member(a, b))
 
a =[1, 2, 3, 4, 5]
b =[6, 7, 8, 9]
print(common_member(a, b))

输出

True 
False

时间复杂度:O(n),其中n是a和b之间的较大列表的大小。
空间复杂度:O(n),其中n是a和b之间的较大列表的大小。

方法4: 使用Counter类

使用collections模块中的Counter类。Counter类是dict的一个子类,用于计算列表中元素的出现次数。
下面是一个例子,说明如何使用Counter类来检查两个列表是否至少有一个公共元素:

from collections import Counter
 
def have_common_element(list1, list2):
    counter1 = Counter(list1)
    counter2 = Counter(list2)
    for element, count in counter1.items():
        if element in counter2 and count > 0:
            return True
    return False
 
a = [1, 2, 3, 4, 5]
b = [5, 6, 7, 8, 9]
print(have_common_element(a, b))  # True
 
a = [1, 2, 3, 4, 5]
b = [6, 7, 8, 9]
print(have_common_element(a, b))  # False

时间复杂度:O(n+m),其中n是list1的长度,m是list2的长度。
空间复杂度:O(k),其中k是两个列表中唯一元素的个数。

方法5:使用operator.countOf()方法

import operator as op
# Python code to check if two lists
# have any element in common
 
# Initialization of list
list1 = [1, 3, 4, 55]
list2 = [90, 1, 22]
 
flag = 0
 
# Using in to check element of
# second list into first list
for elem in list2:
    if op.countOf(list1, elem) > 0:
        flag = 1
 
# checking condition
if flag == 1:
    print("True")
else:
    print("False")

输出

True

时间复杂度:O(n)
空间复杂度:O(1)

方法6:使用any()和列表解析

列表解析通过将第一个列表的每个元素与第二个列表的每个元素进行比较来创建布尔值列表。如果列表中至少有一个布尔值为True,则any()函数返回True,表示两个列表之间至少有一个公共元素。

def common_member(a, b):
    return any(i in b for i in a)
  
a = [1, 2, 3, 4, 5]
b = [5, 6, 7, 8, 9]
print(common_member(a, b))  # True
  
a =[1, 2, 3, 4, 5]
b =[6, 7, 8, 9]
print(common_member(a, b))  # False

输出

True
False

时间复杂度:O(n*m),其中n和m是输入列表的长度。
空间复杂度:O(1)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python收藏家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值