【问题标题】:How to check subsequence exists in a list? [duplicate]如何检查列表中是否存在子序列? [复制]
【发布时间】:2016-01-28 07:05:25
【问题描述】:

在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

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

【问题讨论】:

标签: python list itertools


【解决方案1】:

可能是这样的:

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

如果search_list 是一个列表。

【讨论】:

  • 这仅检查search_list 中的所有项目是否单独存在于my_list - 它不检查它们是否作为子序列存在,因此x_in_y([2,4], [1,2,3,4,5]) 测试错误地返回True。
  • 还有:x_in_y([1, 1, 1, 1], [1])
【解决方案2】:

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

【讨论】:

  • 可以将range(len(base))改为range(len(base) - l + 1),避免一些多余的处理。
猜你喜欢
  • 1970-01-01
  • 2011-06-10
  • 2016-03-06
  • 2021-06-02
  • 2018-01-31
  • 2017-01-27
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多