判断一个列表是另外一个列表的子列表

pre_seq_list = [[17, 37, 38, 37, 38, 37, 38, 37], [17, 37, 38, 37, 38, 37, 37], [17, 37, 38, 37, 38, 38, 37],

  [17, 37, 38, 37, 37, 38, 37, 37], [17, 37, 38, 37, 37, 38, ], [17, 37, 38, 37, 37, 38, 38, 37],
  [17, 37, 38, 37, 37, 37, 37, 38, 37], [17, 37, 38, 37, 37, 37, 37, 37], [17, 37, 38, 37, 37, ],
      [17, 37, 38, 37, 38, 37, 38, 37, 39], [17, 37, 38, 37, 37, 37, 37, 38, 37, 39]]
"""把列表组合按照大小排序"""
num_seq = len(pre_seq_list)
order_list = []
while len(order_list) < num_seq:
    m = pre_seq_list[0]
    k=0
    for i in range(len(pre_seq_list)):
        if len(pre_seq_list[i]) <= len(m):
            m = pre_seq_list[i]
            k = i

    order_list.append(pre_seq_list[k])
    del pre_seq_list[k]
# print(order_list)


"""定义函数判断l1是不是l2的子列表"""
def is_l1_in_l2(l1, l2):  # 如果列表l1是列表l2的子序列,则返回1
    cursor = 0  # 记录匹配到item条目的位置,下一个条目匹配从此位置开始
    num_item = 0  # 记录匹配列表l1条目的值
    for item in l1:
        if cursor < len(l2):
            for j in range(cursor, len(l2)):
                if l2[j] == item:
                    cursor = j+1
                    num_item = num_item+1
                    break
    if num_item == len(l1):  # 如果能l1是l2的子序列,则返回true
        return 1
    else:  # 返回false
        return 0


while i < len(order_list):
    for j in range(i+1, len(order_list)):
        if is_l1_in_l2(order_list[i], order_list[j]):
            del order_list[i]
            break
    i = i+1

print(len(order_list))

当然,以上代码只适合我的要求,项目要求[1,2,3]是[1,2,3,4] , [1,3,2,3,4,] , [1,1,2,,2,3,3,], [1,32,4,4,65,2,2,4,3]等列表的子序列列表。

接下来的代码才是实实在在的判断一个列表是另外一个列表的子列表:

def is_l1_in_l2(l1, l2):  # 如果列表l1是列表l2的子序列,则返回1
    
    flag = 0  # 如果匹配成功这置为1
    
    for j in range(len(l2)):
        child_list = l2[i:i+len(l1)]  # 截取与l1等长的序列
        if child_list == l1:
            flag =1
            break  # 找到匹配项,则跳出循环,结束函数
    return flag
  

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值