【问题标题】:Check if index of elements in two lists are consecutive检查两个列表中元素的索引是否连续
【发布时间】:2018-10-31 18:18:05
【问题描述】:

如果 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 语句让我感到困惑,因为我不确定如何检查两个不同列表中的连续数字。

【问题讨论】:

    标签: python list for-loop


    【解决方案1】:

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

    使用迭代器,获取下一个值进行测试非常简单。使用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
    

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

    【讨论】:

    • 耶稣。我一直在 python 上编写代码,但不知道 iter() 已经存在了几年了。
    【解决方案2】:

    根据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
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这需要对第二个列表进行多次扫描;您可以在一次扫描中完成此操作。
      • 是的,但它是一个懒惰的解决方案,应该让 OP 朝着正确的方向轻推。它处理边缘情况
      • list1 = (15,1,10); list2 = (1,15,1,10)
      • 我不知道这是怎么回事,你能详细说明一下吗?
      • 在您的解决方案中不是问题,因为它天生就可以处理它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      相关资源
      最近更新 更多