<p>您可以将列表分成8个元素的块,并将子元素映射到str:</p>
<pre><code>[int("".join(map(str, bits[i:i+8])), 2) for i in range(0, len(bits), 8)]
</code></pre>
<p>您可以将其分为两部分:映射和连接一次:</p>
^{pr2}$
<p>或者使用iter并借用itertools中的grouper<a href="https://docs.python.org/2/library/itertools.html#recipes" rel="nofollow">recipe</a>:</p>
<pre><code>it = iter(map(str, bits))
[int("".join(sli), 2) for sli in zip(*iter([it] * 8))]
</code></pre>
<p><code>iter(map(str, bits))</code>将位的内容映射到str并创建一个<a href="http://anandology.com/python-practice-book/iterators.html" rel="nofollow">iterator</a>,<code>zip(*iter([it] * 8))</code>将元素分成8个子元素的组。<br/>
每个<code>zip(*iter..</code>使用迭代器中的八个子元素,因此我们总是得到顺序组,这与第一个代码中的切片逻辑相同,我们只是避免了切片的需要。在</p>
<p>正如Sven所说,对于不能被<code>n</code>整除的列表,使用zip将丢失与原始代码类似的数据,您可以调整我链接的grouper配方来处理这些情况:</p>
<pre><code>from itertools import zip_longest # izip_longest python2
bits = [1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1,1,0]
it = iter(map(str, bits))
print( [int("".join(sli), 2) for sli in izip_longest(*iter([it] * 8),fillvalue="")])
[149, 107, 231, 2] # using just zip would be [149, 107, 231]
</code></pre>
<p><code>fillvalue=""</code>意味着我们用空字符串填充奇数长度组,这样我们仍然可以调用<code>int("".join(sli), 2)</code>并获得正确的输出,如上面所示,在获取<code>3 * 8</code>块之后,我们只剩下<code>1,0</code>。在</p>
<p>在您自己的代码中,<code>bytes += [int(byt, 2)]</code>可以简单地变成<code>bytes.append(int(byt, 2))</code></p>