Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在列表中查找连续值_Python_List_Python 3.x - Fatal编程技术网

Python 在列表中查找连续值

Python 在列表中查找连续值,python,list,python-3.x,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])

我有一个价值清单:

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]))
如果您只需要它来处理列表,而不需要任何iterable,则可以使用:

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))
Raymond提到的方法的基本实现:

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]))

这种方法的优点是,它不必对每个索引进行切片直到第一个匹配,只需对与段中第一个值的匹配相对应的索引进行切片。

您可以使用滚动窗口迭代器,在这种情况下,可以使用旧版本的
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]))
如果您只需要它来处理列表,而不需要任何iterable,则可以使用:

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))
Raymond提到的方法的基本实现:

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]))

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

有很多方法可以做到这一点,它们都是同构的


最简单的方法是使用list.index()进行简单的搜索,以找到一个公共的起点,然后使用一个片段来检查完全匹配。如果没有匹配项,请重复搜索,直到您到达列表的末尾。

有许多方法可以做到这一点,它们都是同构的


最简单的方法是使用list.index()进行简单的搜索,以找到一个公共的起点,然后使用一个片段来检查完全匹配。如果没有匹配项,请重复搜索,直到到达列表的末尾。

这应该适用于Python 2.5及更新版本:

def does_segment_exist(sequence, segment):
    n, m = len(sequence), len(segment)
    return any(segment == sequence[i:i+m] for i in range(n+1-m))

这应该适用于Python 2.5及更新版本:

def does_segment_exist(sequence, segment):
    n, m = len(sequence), len(segment)
    return any(segment == sequence[i:i+m] for i in range(n+1-m))

可能重复的>>>方法描述符上的帮助(list.index)帮助的可能重复:index(…)L.index(value,[start,[stop]])->integer--返回值的第一个索引。如果该值不存在,则引发ValueError。文档的“标准类型”页面上未显示的任何特定原因?请为文档更新提交错误跟踪报告。它可能被忽略了(在某一点上,并非所有序列都有index())。>>>方法描述符的帮助(list.index)帮助:index(…)L.index(value,[start,[stop]])->integer--返回值的第一个索引。如果该值不存在,则引发ValueError。文档的“标准类型”页面上未显示的任何特定原因?请为文档更新提交错误跟踪报告。它可能被忽略了(在某一点上,并非所有序列都有index())。如果你看我的第二个序列,它是相同的——短路切片比较<在中,code>只是自动执行
=
。抱歉,忽略了这一点。是的,它本质上是相同的,并且不应该有值得注意的性能差异。实际上,使用“in”的解决方案看起来更优雅,并且适用于较旧的Python版本。如果您查看我的第二个解决方案,它是相同的——短路切片比较<在中,code>只是自动执行
=
。抱歉,忽略了这一点。是的,它本质上是相同的,并且不应该有值得注意的性能差异。实际上,您使用“in”的解决方案看起来更优雅,并且适用于较旧的Python版本。