您可以切片列表爲8種元素的塊和子元素映射到STR:
[int("".join(map(str, bits[i:i+8])), 2) for i in range(0, len(bits), 8)]
你可以把它分解成兩個部分映射和連接一次:
mapped = "".join(map(str, bits))
[int(mapped[i:i+8], 2) for i in range(0, len(mapped), 8)]
或者使用ITER並從石斑魚recipe在itertools借用:
it = iter(map(str, bits))
[int("".join(sli), 2) for sli in zip(*iter([it] * 8))]
iter(map(str, bits))
位str的內容映射,並創建一個iterator,zip(*iter([it] * 8))
組的元素爲8子元件的組。
每個zip(*iter..
消耗我們的迭代器8子元素,所以我們總能得到連續的羣體,這是同樣的邏輯在第一代碼我們只是避免需要切片切片。
由於斯文評論說,對於列表未除盡n
你會使用數據壓縮類似於原來的代碼,就可以實現各種石斑魚食譜輸了,我掛來處理這些情況:
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]
的fillvalue=""
意味着我們墊空字符串奇數長度組,所以我們可以仍然稱int("".join(sli), 2)
,並得到正確的輸出如上面我們留下1,0
服用3 * 8
塊後的位置。
在自己的代碼bytes += [int(byt, 2)]
可以簡單地成爲bytes.append(int(byt, 2))
啊,我看到你也想過'石斑魚()'以及:)。 – Cyphase
@Cyphase,是的,如果OP想要保持奇數長度的片段,那將是一條路。 –
@PadraicCunningham:如果列表的長度不能被8整除,你的版本會丟棄多餘的位,因爲'zip()'在最短序列上停止。 –