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

时间:2018-10-31 18:18:06

标签: python list for-loop

如果将list1定义为[15,1,20] 并且list2被定义为[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语句让我感到困惑,因为我不确定如何检查两个不同列表中的连续数字。

3 个答案:

答案 0 :(得分:2)

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

使用迭代器,对下一个值进行测试非常简单。使用iter()lst1创建一个迭代器,然后next() function为您提供列表顺序中的下一项。当该电话引发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 = [15, 1, 20]
>>> sublist(lst1, [6, 15, 3, 1, 6, 20])
True
>>> sublist(lst1, [6, 1, 15, 20, 3])
False

请注意,如果True为空(空列表总是 一个有序子集),该函数还会返回lst1;如果{{1} }不是空的,但是False (空列表永远不能是超集)。

答案 1 :(得分:1)

基于list.index方法的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

此操作会迭代查找lst1lst2的元素,同时适当地向前查找的起始索引,直到在lst2的其余部分或全部中找不到任何元素为止找到了。

答案 2 :(得分:0)

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