给出两个列表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)。