Python 检查两个列表中元素的索引是否连续

Python 检查两个列表中元素的索引是否连续,python,list,for-loop,Python,List,For Loop,如果列表1定义为[15,1,20] 列表2定义为[6,15,3,1,6,20] 该函数将返回True,因为列表2以相同的顺序包含(15,1,20) 但是,如果列表2被定义为[6,1,15,20,3],则序列为(1,15,20),因此它将返回False def sublist(lst1,lst2): for i in lst1: if i in lst2: if ## ?? ## return True ret

如果列表1定义为
[15,1,20]
列表2定义为
[6,15,3,1,6,20]

该函数将返回True,因为列表2以相同的顺序包含
(15,1,20)

但是,如果列表2被定义为
[6,1,15,20,3]
,则序列为
(1,15,20)
,因此它将返回False

def sublist(lst1,lst2):
    for i in lst1:
        if i in lst2:
            if ## ?? ##
                return True
    return False

if语句是我感到困惑的地方,因为我不知道如何检查两个不同列表中的连续数字。

获取第二个列表中原始列表中每个项目的索引列表,并检查它们是否按升序组合。

获取第二个列表中原始列表中每个项目的索引列表,然后检查它们的任何组合是否按升序排列

根据方法的
start
参数,以下选项将起作用:

def sublist(lst1, lst2):
    ind = 0
    for a in lst1:
        try:
            ind = lst2.index(a, ind)
        except ValueError:
            return False
    return True

>>> sublist([1,2,3], [4,1,3,2,5])
False
>>> sublist([1,2,3], [4,1,2,5,3])
True

这将在
lst2
中迭代查找
lst1
的元素,同时适当地向前移动开始索引进行查找,直到在
lst2
的其余部分中找不到任何元素或找到所有元素为止。

根据方法的
start
参数,以下操作将起作用:

def sublist(lst1, lst2):
    ind = 0
    for a in lst1:
        try:
            ind = lst2.index(a, ind)
        except ValueError:
            return False
    return True

>>> sublist([1,2,3], [4,1,3,2,5])
False
>>> sublist([1,2,3], [4,1,2,5,3])
True

这将在
lst2
中迭代查找
lst1
的元素,同时适当地向前移动开始索引进行查找,直到在
lst2
的其余部分中找不到任何元素或找到所有元素。

从输入列表中选取一项,向前扫描第二个列表,直到找到匹配项,然后进行下一项,继续前进,等等

使用迭代器,测试下一个值非常简单。使用为
lst1
创建迭代器,然后按列表顺序为您提供下一项。当该调用引发
StopIteration
时,您知道已经测试了第一个列表中的所有值:

def sublist(lst1, lst2):
    source = iter(lst1)
    try:
        item = next(source)
        for value in lst2:
            if item == value:
                item = next(source)
        return False
    except StopIteration:
        # all items in lst1 checked
        return True
演示:


请注意,如果
lst1
为空(空列表始终是一个有序的子集),该函数还返回
True
,如果
lst1
不是空的,但
lst2
是空的(空列表永远不能是超集),则返回
False
.

从输入列表中选择一项,向前扫描第二个列表,直到找到匹配项,然后选择下一项,继续向前,等等

使用迭代器,测试下一个值非常简单。使用为
lst1
创建迭代器,然后按列表顺序为您提供下一项。当该调用引发
StopIteration
时,您知道已经测试了第一个列表中的所有值:

def sublist(lst1, lst2):
    source = iter(lst1)
    try:
        item = next(source)
        for value in lst2:
            if item == value:
                item = next(source)
        return False
    except StopIteration:
        # all items in lst1 checked
        return True
演示:


请注意,如果
lst1
为空(空列表始终是一个有序的子集),则函数还返回
True
,如果
lst1
不是空的,但
lst2
是空的(空列表永远不能是超集)。

这将对第二个列表进行多次扫描;你可以在一次扫描中完成这项工作。是的,但这是一个懒惰的解决方案,应该会给OP一个正确的方向。它处理的边caseslist1=(15,1,10);list2=(1,15,1,10)我不确定这是一种边缘情况,你能详细说明一下吗?这在你的解决方案中不是一个问题,因为它固有地处理它,在第二个列表中需要多次扫描;你可以在一次扫描中完成这项工作。是的,但这是一个懒惰的解决方案,应该会给OP一个正确的方向。它处理的边caseslist1=(15,1,10);list2=(1,15,1,10)我不确定这是一个什么样的边缘情况,你能详细说明一下吗?在你的解决方案中不是一个问题,因为它内在地处理它。我一直在用python编写代码,却不知道
iter()
已经存在了好几年了。几年来,我一直在用python编写代码,根本不知道
iter()
的存在。