Python-检查列表中的子列表判断列表之间是否为包含关系

有时,在使用 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() + 列表切片 + 列表生成器

以上函数的组合用于解决这个问题。在此,我们使用 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判断列表之间是否为包含关系,不用自定义函数

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值