<p>由于<code>a</code>已排序,您可以在列表中的索引范围上使用<a href="https://docs.python.org/3/library/itertools.html#itertools.groupby" rel="nofollow noreferrer">^{<cd2>}</a>,由<code>a</code>键控:</p>
<pre><code>from itertools import groupby
result_a = []
result_b = []
result_c = []
for _, group in groupby(range(len(a)), key=a.__getitem__):
group = list(group)
index = slice(group[0], group[-1] + 1)
result_a.append(k)
result_b.append(np.concatenate(b[index]))
result_c.append(np.concatenate(c[index]))
</code></pre>
<p><code>group</code>是一个迭代器,因此需要使用它来获得它所表示的实际索引。每个<code>group</code>包含与<code>list_a</code>中相同值对应的所有索引</p>
<p><code>slice(...)</code>是在索引表达式中有<code>:</code>时传递给<code>list.__getitem__</code>的内容<code>index</code>相当于<code>group[0]:group[-1] + 1]</code>。这将切掉列表中与<code>list_a</code>中的每个键对应的部分</p>
<p>最后,<code>np.concatenate</code>只是将数组批量合并在一起</p>
<p>如果您想在不执行<code>list(group)</code>的情况下执行此操作,那么可以通过其他方式使用迭代器,而不必保留值。例如,您可以让<code>groupby</code>为您做这件事:</p>
<pre><code>from itertools import groupby
result_a = []
result_b = []
result_c = []
prev = None
for _, group in groupby(range(len(a)), key=a.__getitem__):
index = next(group)
result_a.append(k)
if prev is not None:
result_b.append(np.concatenate(b[prev:index]))
result_c.append(np.concatenate(c[prev:index]))
prev = index
if prev is not None:
result_b.append(np.concatenate(b[prev:]))
result_c.append(np.concatenate(c[prev:]))
</code></pre>
<p>在这一点上,您甚至不需要真正使用<code>groupby</code>,因为自己跟踪每件事不会有太多的工作:</p>
<pre><code>result_a = []
result_b = []
result_c = []
k = None
for i, n in enumerate(a):
if n == k:
continue
result_a.append(n)
if k is not None:
result_b.append(np.concatenate(b[prev:i]))
result_c.append(np.concatenate(c[prev:i]))
k = n
prev = index
if k is not None:
result_b.append(np.concatenate(b[prev:]))
result_c.append(np.concatenate(c[prev:]))
</code></pre>