python - 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]
有什么想法可以实现吗?
解决方案
这是一个更通用的解决方案,它不需要列表是可切片的,因此您可以在其他可迭代对象上使用它,例如生成器。
我们保持序列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]]
推荐阅读
- php - 如何从 PHP 转换为 .HTACCESS(关于引荐来源网址的重定向)
- java - 在 java 中重写 toString()
- cytoscape.js - 通过 cytoscape.js 设置绘图边缘长度时如何将参数传递给 cola.js?
- tensorflow - 如何在 TensorFlow 2 中全局使用 CPU
- java - Java中的多个重复组模式匹配
- python - 根据 Python 中的给定参数更改函数行为
- python - 我在 python 中遇到了麻烦。我不知道哪个是错的。这是简单的代码
- css - 带有 css 和视口的 If 语句
- angular - Docker“无法执行 e2e 脚本”
- docker - Pod 因错误和退出代码原因终止:1