<p>您可以使用<a href="https://docs.python.org/3/library/itertools.html#itertools.accumulate" rel="nofollow noreferrer">^{<cd1>}</a>,也许:</p>
<pre><code>from itertools import accumulate
s = "thisismystring"
keys = [4, 2, 2, 6]
new = []
start = 0
for end in accumulate(keys):
new.append(s[start:end])
start = end
</code></pre>
<p>您可以通过添加另一个从零开始的<code>accumulate()</code>调用来内联<code>start</code>值:</p>
<pre><code>for start, end in zip(accumulate([0] + keys), accumulate(keys)):
new.append(s[start:end])
</code></pre>
<p>此版本可制成列表:</p>
<pre><code>[s[a:b] for a, b in zip(accumulate([0] + keys), accumulate(keys))]
</code></pre>
<p>后一版本的演示:</p>
<pre><code>>>> from itertools import accumulate
>>> s = "thisismystring"
>>> keys = [4, 2, 2, 6]
>>> [s[a:b] for a, b in zip(accumulate([0] + keys), accumulate(keys))]
['this', 'is', 'my', 'string']
</code></pre>
<p>双累积可以用<code>tee()</code>替换,包装在<a href="https://docs.python.org/3/library/itertools.html#itertools-recipes" rel="nofollow noreferrer">^{<cd5>} function from the ^{<cd6>} documentation</a>中:</p>
<pre><code>from itertools import accumulate, chain, tee
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)
[s[a:b] for a, b in pairwise(accumulate(chain([0], keys)))]
</code></pre>
<p>我加入了一个<a href="https://docs.python.org/3/library/itertools.html#itertools.chain" rel="nofollow noreferrer">^{<cd7>} call</a>作为0起始位置的前缀,而不是用连接创建一个新的list对象。你知道吗</p>