<p>当然,有几种不同的方法来编写解决方案。让我们忘记使用索引(因为当找不到标记时需要捕获异常;我假设您需要一个没有索引的简单算法)。如果您仔细阅读这两个描述,下面的代码实际上是Michael建议的变体:</p>
<pre><code>data = ['a', 2, 'b',
'start', 1, 2, 3, 'end',
'c', 'd',
'start', 2, 2, 5, 'end',
10,
'start', 5, 6 ,7, 'end']
blocks = [] # to keep valid data blocks
pos = 0
end = len(data)
while pos < end:
if data[pos] == 'start':
block = []
pos += 1
while pos < end and data[pos] != 'end': # condition order important!
block.append(data[pos])
pos += 1
blocks.append(block)
else:
pos += 1
print(blocks)
</code></pre>
<p>说明:</p>
<p>我们将在变量<code>blocks</code>中收集有效的数据块。你知道吗</p>
<p>我们使用<code>pos</code>(position)从开始到<code>end</code>(而不是更多)遍历列表以保持当前索引位置。找到<code>'start'</code>意味着创建一个空的新<code>block</code>来存储下一个项目,直到找到一个<code>'end'</code>标记。你知道吗</p>
<p>我们附加块数据,但要注意列表不会过早结束,直到找到<code>'end'</code>标记。条件顺序很重要,因为否则我们可能会尝试使用无效(太大)索引访问<code>data</code>。如果左侧的第一个条件已经为False,则<code>and</code>运算符右侧的条件不会被计算,因此在这种情况下不会出现错误。你知道吗</p>
<p>我们继续,直到名单结束。你知道吗</p>
<p>如果有一个<code>'start'</code>标记没有和<code>'end'</code>标记,则在结果<code>blocks</code>列表中会留下最后一个空块。你知道吗</p>