<p>来自Ruby背景,我经常觉得需要在Python中使用<a href="https://ruby-doc.org/core-2.4.2/Enumerable.html#method-i-slice_before" rel="nofollow noreferrer">^{<cd1>}</a>之类的东西。它基本上把任何iterable分成块。切片在谓词为true的每个元素之前完成。在</p>
<p>基于<a href="https://github.com/rubinius/rubinius/blob/master/core/enumerable.rb#L136" rel="nofollow noreferrer">Rubinius implementation</a>,我将代码移植到Python。在</p>
<pre><code>def slice_before(iterable, predicate):
chunk = None
for elem in iter(iterable):
if predicate(elem):
if chunk:
yield chunk
chunk = [elem]
else:
if not chunk:
chunk = []
chunk.append(elem)
if chunk:
yield chunk
</code></pre>
<p>以下是几个例子:</p>
^{pr2}$
<p>你只需要初始化你的数据。请注意,<code>code_list</code>可以是一个用于更快查找的集合:</p>
<pre><code>original_list = [('1321', '01'), ('MessageXZY', '02'), ('DescriptionSKS', '03'), ('S7_6', '04'), ('S7_3', '05'), ('0A3B', '06'), ('MessageZYA', '07'), ('DescriptionKAM', '08'), ('9K44', '09'), ('MessageYAL', '10'),
('DescriptionAUS', '11'), ('S7_2', '12')]
code_list = {'1321', '0A3B','9K44'}
</code></pre>
<p>您的问题所需的代码将变成<code>slice_before</code>的一行代码:</p>
<pre><code>print(list(slice_before(original_list, lambda x_y: x_y[0] in code_list)))
# [[('1321', '01'), ('MessageXZY', '02'), ('DescriptionSKS', '03'), ('S7_6', '04'), ('S7_3', '05')], [('0A3B', '06'), ('MessageZYA', '07'), ('DescriptionKAM', '08')], [('9K44', '09'), ('MessageYAL', '10'), ('DescriptionAUS', '11'), ('S7_2', '12')]]
</code></pre>