<p>起初,我认为这是一个重复,但现有的线程似乎没有考虑到“尽可能均匀”的要求。使用<code>textwrap.wrap</code>、<code>zip</code>和大多数itertools解决方案会在最后留下一个悬空的不均匀块。这个解决方案从前面分块<code>n</code>和焊盘的任意值。你知道吗</p>
<p>方法是取iterable长度的商和余数,并开始按所需的块大小进行迭代。对于每个区块,如果有余数,则向区块添加1。按块大小+1递增步长,并递减余数。如果没有剩余,则正常生成块。你知道吗</p>
<p>下面是函数和测试代码:</p>
<pre><code>def chunk(iterable, chunks):
if chunks < 1:
raise ValueError("invalid chunk size")
q, r = divmod(len(iterable), chunks)
i = 0
while i < len(iterable):
if r > 0:
r -= 1
yield iterable[i:i+q+1]
i += 1
else:
yield iterable[i:i+q]
i += q
if __name__ == "__main__":
s = "".join(map(chr, range(97, 115)))
for i in range(len(s) + 1):
for j in range(1, len(s[:i]) + 1):
print(repr(s[:i]), " chunk size", j, ":")
print(list(chunk(s[:i], j)), "\n")
</code></pre>
<p>输出摘录:</p>
<pre class="lang-none prettyprint-override"><code>'abcde' chunk size 1 :
['abcde']
'abcde' chunk size 2 :
['abc', 'de']
'abcde' chunk size 3 :
['ab', 'cd', 'e']
'abcde' chunk size 4 :
['ab', 'c', 'd', 'e']
'abcde' chunk size 5 :
['a', 'b', 'c', 'd', 'e']
</code></pre>
<pre class="lang-none prettyprint-override"><code>'abcdefgh' chunk size 1 :
['abcdefgh']
'abcdefgh' chunk size 2 :
['abcd', 'efgh']
'abcdefgh' chunk size 3 :
['abc', 'def', 'gh']
'abcdefgh' chunk size 4 :
['ab', 'cd', 'ef', 'gh']
'abcdefgh' chunk size 5 :
['ab', 'cd', 'ef', 'g', 'h']
'abcdefgh' chunk size 6 :
['ab', 'cd', 'e', 'f', 'g', 'h']
'abcdefgh' chunk size 7 :
['ab', 'c', 'd', 'e', 'f', 'g', 'h']
'abcdefgh' chunk size 8 :
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
</code></pre>
<pre class="lang-none prettyprint-override"><code>'abcdefghijklm' chunk size 1 :
['abcdefghijklm']
'abcdefghijklm' chunk size 2 :
['abcdefg', 'hijklm']
'abcdefghijklm' chunk size 3 :
['abcde', 'fghi', 'jklm']
'abcdefghijklm' chunk size 4 :
['abcd', 'efg', 'hij', 'klm']
'abcdefghijklm' chunk size 5 :
['abc', 'def', 'ghi', 'jk', 'lm']
'abcdefghijklm' chunk size 6 :
['abc', 'de', 'fg', 'hi', 'jk', 'lm']
'abcdefghijklm' chunk size 7 :
['ab', 'cd', 'ef', 'gh', 'ij', 'kl', 'm']
'abcdefghijklm' chunk size 8 :
['ab', 'cd', 'ef', 'gh', 'ij', 'k', 'l', 'm']
'abcdefghijklm' chunk size 9 :
['ab', 'cd', 'ef', 'gh', 'i', 'j', 'k', 'l', 'm']
'abcdefghijklm' chunk size 10 :
['ab', 'cd', 'ef', 'g', 'h', 'i', 'j', 'k', 'l', 'm']
'abcdefghijklm' chunk size 11 :
['ab', 'cd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm']
'abcdefghijklm' chunk size 12 :
['ab', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm']
'abcdefghijklm' chunk size 13 :
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm']
</code></pre>
<p>现在,编写<code>trisect</code>函数如下所示:</p>
<pre><code>def trisect(s):
return list(chunk(s, 3))
</code></pre>