Skip to main content
 首页 » 编程设计

python之在列表中查找连续值

2025年05月04日18lvdongjie

我有一个值列表:

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

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