如何测试一个列表是否包含另一个列表?

发布于 2021-01-29 14:10:30

如何测试一个列表是否包含另一个列表(即它是一个连续的子序列)。假设有一个名为contains的函数:

contains([1,2], [-1, 0, 1, 2]) # Returns [2, 3] (contains returns [start, end])
contains([1,3], [-1, 0, 1, 2]) # Returns False
contains([1, 2], [[1, 2], 3]) # Returns False
contains([[1, 2]], [[1, 2], 3]) # Returns [0, 0]

编辑:

contains([2, 1], [-1, 0, 1, 2]) # Returns False
contains([-1, 1, 2], [-1, 0, 1, 2]) # Returns False
contains([0, 1, 2], [-1, 0, 1, 2]) # Returns [1, 3]
关注者
0
被浏览
158
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是我的版本:

    def contains(small, big):
        for i in xrange(len(big)-len(small)+1):
            for j in xrange(len(small)):
                if big[i+j] != small[j]:
                    break
            else:
                return i, i+len(small)
        return False
    

    正如安德鲁·贾菲(Andrew Jaffe)在他的评论中指出的那样,它返回一个元组(start,end +
    1),因为我认为这更像pythonic。它不对任何子列表进行切片,因此应该相当有效。

    新手感兴趣的一点是,它使用了for语句上else子句-这不是我经常使用的东西,但是在这种情况下可能是无价的。

    这与在字符串中查找子字符串相同,因此对于大型列表,实现诸如Boyer-
    Moore算法之
    类的方法可能更有效。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看