首页 > 解决方案 > Python:使用模块或正则表达式从列表中提取列表

问题描述

我正在尝试通过使用开始模式和结束模式从一个更大的整数列表中提取列表/子列表。我想用一个函数来做,但我找不到解决这个问题的库、算法或正则表达式。

def myFunctionForSublists(data, startSequence, endSequence):
    # ... todo

data = [99, 99, 1, 2, 3, 99, 99, 99, 4, 5, 6, 99, 99, 1, 2, 3, 99, 4, 5, 6, 99]

startSequence = [1,2,3]
endSequence = [4,5,6]

sublists = myFunctionForSublists(data, startSequence, endSequence)

print sublists[0] # [1, 2, 3, 99, 99, 99, 4, 5, 6]
print sublists[1] # [1, 2, 3, 99, 4, 5, 6]

有什么想法可以实现吗?

标签: pythonregexlistsearch

解决方案


这是一个更通用的解决方案,它不需要列表是可切片的,因此您可以在其他可迭代对象上使用它,例如生成器。

我们保持序列deque的大小,start直到遇到它。然后我们将这些值添加到列表中,并继续迭代序列。正如我们所做的那样,我们保持deque结束序列的大小,直到我们看到它,同时将元素添加到我们保留的列表中。如果我们遇到结束序列,我们yield会列出并设置deque扫描下一个开始序列。

from collections import deque

def gen(l, start, stop):
    start_deque = deque(start)
    end_deque = deque(stop)
    curr_deque = deque(maxlen=len(start))
    it = iter(l)
    for c in it:
        curr_deque.append(c)
        if curr_deque == start_deque:
            potential = list(curr_deque)
            curr_deque = deque(maxlen=len(stop))
            for c in it:
                potential.append(c)
                curr_deque.append(c)
                if curr_deque == end_deque:
                    yield potential
                    curr_deque = deque(maxlen=len(start))
                    break

print(list(gen([99, 99, 1, 2, 3, 99, 99, 99, 4, 5, 6, 99, 99, 1, 2, 3, 99, 4, 5, 6, 99], [1,2,3], [4,5,6])))

# [[1, 2, 3, 99, 99, 99, 4, 5, 6], [1, 2, 3, 99, 4, 5, 6]]

推荐阅读