python - 在列表中查找连续值

标签 python list python-3.x

我有一个值列表:

a = [1,3,4,5,2]

我现在想要以下功能:

does_segment_exist(a, [1,3,4]) #True
does_segment_exist(a, [3,4,5]) #True
does_segment_exist(a, [4,5,2]) #True
does_segment_exist(a, [1,4,5]) #False
does_segment_exist(a, [1,3]) #True
does_segment_exist(a, [1,4]) #False

因此必须按连续顺序找到这些值。

我有在 Python 3 中执行此操作的巧妙方法吗?

最佳答案

您可以使用滚动窗口迭代器,在本例中是旧版本的 itertools 文档:

from itertools import islice

def window(seq, n=2):
    "Returns a sliding window (of width n) over data from the iterable"
    "   s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ...                   "
    it = iter(seq)
    result = tuple(islice(it, n))
    if len(result) == n:
        yield result
    for elem in it:
        result = result[1:] + (elem,)
        yield result

def does_segment_exist(iterable, sublist):
    return tuple(sublist) in window(iterable, len(sublist))

print(does_segment_exist([1,3,4,5,2], [3,4,5]))

如果你只需要它在列表上工作,而不是任何可迭代的,你可以使用:

def does_segment_exist(seq, sublist):
    # seq and sublist must both be lists
    n = len(sublist)
    return sublist in (seq[i:i+n] for i in range(len(seq) + 1 - n))

雷蒙德提到的方法的基本实现:

def does_segment_exist(seq, sublist):
    first = sublist[0]
    i = 0
    n = len(sublist)
    while True:
        try:
            i = seq.index(first, i)
        except ValueError:
            return False
        if sublist == seq[i:i+n]:
            return True
        i += 1

print(does_segment_exist([1,3,4,5,2], [3,4,5]))

此方法的优点是它不必对第一个匹配项之前的每个索引进行切片,只需对与段中第一个值的匹配项对应的索引进行切片。

关于python - 在列表中查找连续值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7968881/

相关文章:

python - 命名一个类以避免与解释语言中的 native 数据结构相关联

list - 是否有像 'map' 这样对参数列表列表而不是多个参数列表进行操作的函数的典型名称?

c++ - 在 C++ 中打印对象列表

python-3.x - 从另一个列表中删除一组不同值的所有实例?

python-3.x - 如何使用selenium重新连接到webdriver打开的浏览器?

python - 如何更改 PyQtGraph 上下文菜单字体大小?

python - 如何在 Django 的表单中嵌套内联表单集?

python - 对列表中的元素求和

python - 如何询问用户特定的字符串并循环直到输入有效的输入?

python - 试图了解 python 中关于 'and' 命令的一个简单特性。谁能澄清一下?