如何检查列表中存在的子序列?

时间:2015-10-28 13:23:07

标签: python list itertools

在python中,可以使用is关键字来检查包含,例如。

>>> 3 in [1,2,3,4,5]
True

但如果它检查单个整数的列表是否在引用列表[1,2,3,4,5]内,则不会产生相同的输出:

>>> [3] in [1,2,3,4,5]
False

此外,使用以下方法无法检查参考列表中的子序列:

>>> [3,4,5] in [1,2,3,4,5]
False

有没有办法让一个函数检查子序列,以便以下返回true?,例如函数调用x_in_y()

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

可能来自itertoolsoperator

(注意,输入列表可以是非唯一的)

2 个答案:

答案 0 :(得分:4)

x_in_y()可以通过切片原始列表并将切片与输入列表进行比较来实现:

def x_in_y(query, base):
    try:
        l = len(query)
    except TypeError:
        l = 1
        query = type(base)((query,))

    for i in range(len(base)):
        if base[i:i+l] == query:
            return True
    return False

如果您使用的是Python2,请将range更改为xrange

答案 1 :(得分:-1)

也许是这样的:

def x_in_y(search_list, my_list):
    return all([s in my_list for s in search_list])

如果search_list是一个列表。