有时,在使用 Python 列表时,我们可能会遇到一个问题,我们需要检查特定子列表是否包含在列表中的精确序列中。该任务可以应用于许多领域,例如学校编程和 Web 开发。
示例数据:
Input : test_list = [5, 6, 3, 8, 2, 1, 7, 1], sublist = [8, 2, 3]
Output : False
Input : test_list = [5, 6, 3, 8, 2, 3, 7, 1], sublist = [8, 2, 3]
Output : True
以上功能的组合可以用来解决这个问题。在此,我们使用列表切片技术通过增量切片执行检查子列表的任务。
# Python3 code to demonstrate working of
# Check for Sublist in List
# Using loop + list slicing
# initializing list
test_list = [5, 6, 3, 8, 2, 1, 7, 1]
# printing original list
print("The original list : " + str(test_list))
# initializing sublist
sublist = [8, 2, 1]
# Check for Sublist in List
# Using loop + list slicing
res = False
for idx in range(len(test_list) - len(sublist) + 1):
if test_list[idx: idx + len(sublist)] == sublist:
res = True
break
# printing result
print("Is sublist present in list ? : " + str(res))
输出:
The original list : [5, 6, 3, 8, 2, 1, 7, 1]
Is sublist present in list ? : True
代码演示:
以上函数的组合用于解决这个问题。在此,我们使用 any() 执行检查等于所需的任何子列表的任务,并且列表切片用于切片所需长度的增量列表。
# Python3 code to demonstrate working of
# Check for Sublist in List
# Using any() + list slicing + generator expression
# initializing list
test_list = [5, 6, 3, 8, 2, 1, 7, 1]
# printing original list
print("The original list : " + str(test_list))
# initializing sublist
sublist = [8, 2, 1]
# Check for Sublist in List
# Using any() + list slicing + generator expression
res = any(test_list[idx: idx + len(sublist)] == sublist
for idx in range(len(test_list) - len(sublist) + 1))
# printing result
print("Is sublist present in list ? : " + str(res))
输出:
The original list : [5, 6, 3, 8, 2, 1, 7, 1]
Is sublist present in list ? : True
代码演示:
方法三:使用for循环+in运算符+len()方法
# Python3 code to demonstrate working of
# Check for Sublist in List
# initializing list
test_list = [5, 6, 3, 8, 2, 1, 7, 1]
# printing original list
print("The original list : " + str(test_list))
# initializing sublist
sublist = [8, 2, 7]
# Check for Sublist in List
c=0
res=False
for i in sublist:
if i in test_list:
c+=1
if(c==len(sublist)):
res=True
# printing result
print("Is sublist present in list ? : " + str(res))
输出:
The original list : [5, 6, 3, 8, 2, 1, 7, 1]
Is sublist present in list ? : True
代码演示:
在网上看到有通过将列表转换为set,然后借助set.issubset方法进行判断。
示例1:
a = [1, 2, 3]
b = [0, 1, 2, 3, 4]
print(set(a).issubset(set(b)))
输出:
True
示例2:
a = [1, 2, 3]
b = [0, 1, 2, 4]
print(set(a).issubset(set(b)))
输出:
False
注意:集合是无序不重复的
1、列表中是可以有重复数据的,但是set中是不存在重复元素的,所以如果要求重复的元素数量也一致的话,改方法是有问题的。
2、set是不保证元素顺序和插入的顺序是一致的,set.issubset()函数并不会保证元素顺序一致。
如果是要求精确匹配通过set方法是不可以的,需要使用前三种方法,具体示例如下
示例3(包含重复数据或者顺序不一致):
# 情形一:包含重复数据
print("Gif图片由SoMirror.com制作")
# initializing list
test_list = [5, 6, 3, 8, 2 , 1, 7, 1]
print("原列表 : " + str(test_list))
sublist = [8, 2, 2 , 1]
print("子列表:" + str(sublist))
# Using loop + list slicing
res = False
for idx in range(len(test_list) - len(sublist) + 1):
if test_list[idx: idx + len(sublist)] == sublist:
res = True
break
print("子列表中存在重复数据,使用循环和列表切片,列表中是否存在子列表 ? : " + str(res))
print("子列表中存在重复数据,使用集合,列表中是否存在子列表 ? : " + str(set(sublist).issubset(set(test_list))))
sublist = [8, 1, 2]
res = False
for idx in range(len(test_list) - len(sublist) + 1):
if test_list[idx: idx + len(sublist)] == sublist:
res = True
break
print("子列表和父列表元素顺序不一致,使用循环和列表切片,列表中是否存在子列表 ? : " + str(res))
print("子列表和父列表元素顺序不一致,使用集合,列表中是否存在子列表 ? : " + str(set(sublist).issubset(set(test_list))))
输出:
Gif图片由SoMirror.com制作
原列表 : [5, 6, 3, 8, 2, 1, 7, 1]
子列表:[8, 2, 2, 1]
子列表中存在重复数据,使用循环和列表切片,列表中是否存在子列表 ? : False
子列表中存在重复数据,使用集合,列表中是否存在子列表 ? : True
子列表和父列表元素顺序不一致,使用循环和列表切片,列表中是否存在子列表 ? : False
子列表和父列表元素顺序不一致,使用集合,列表中是否存在子列表 ? : True
代码演示:
通过以上演示我们可以发现如果需要精确匹配使用set方法是有问题的。
参考文章链接:
1、Python – Check for Sublist in List
2、python判断列表之间是否为包含关系,不用自定义函数