我有一个字符串列表,如下所示:
sixbit = ['000011', '000001', '010100', '100001']
我想迭代这个列表并生成一个看起来像这样的新列表:
eightbit = ['00001100', '00010101', '00100001']
出于说明的目的,len(sixbit)等于4,因为它可以很好地转换为8位。理想情况下,六位可以是任意长度 - 如果八位“切断”任何剩余的1或0,那就没问题。
以下是我尝试过的一些代码......遗憾的是,它是远离,但也许你可以看到我正在尝试做的事情。这个想法是1)将所有数字放入一个大字符串2)循环每个数字并保持计数,在迭代时将数字收集到持有者3)当count = 8附加到列表4)继续迭代
def compress_six_bit(ary):
final_list = []
holder = ''
temp_string = ''
encode_counter = 0
for i in ary:
holder = holder + i
while encode_counter < 8:
encode_counter = encode_counter + 1
temp_string = temp_string + i
final_list.append(temp_string)
encode_counter = 0
temp_string = ''
return final_list
答案 0 :(得分:5)
>>> chained = itertools.chain.from_iterable(sixbit)
>>> [''.join(bits) for bits in itertools.izip(*[chained]*8)]
['00001100', '00010101', '00100001']
chained
只是原始字符串的所有字母的迭代器。它使用itertools
中的chained
函数。
>>> chained = itertools.chain.from_iterable(sixbit)
>>> list(chained)
['0', '0', '0', '0', '1', '1', '0', '0', '0', '0', '0', '1', '0', '1', '0', '1', '0', '0', '1', '0', '0', '0', '0', '1']
[chained]*8
创建包含相同 chained
对象8次的列表。
*
只需将这8个元素解压缩到izip
个参数中。
izip
只返回元组,其中第一个包含参数中每个链式迭代器的第一个字母,第二个元组包含第二个字母等。有8个链式对象,所以有8个字母在每个元组。
最重要的是,这些字母是从每个迭代器中获取的,但它实际上是同一个迭代器的8个实例。它会被每次通话消耗掉。所以第一个元组包含链式迭代器的前8个字母。
>>> chained = itertools.chain.from_iterable(sixbit)
>>> list(itertools.izip(*[chained]*8))
[('0', '0', '0', '0', '1', '1', '0', '0'), ('0', '0', '0', '1', '0', '1', '0', '1'), ('0', '0', '1', '0', '0', '0', '0', '1')]
在最后一步,我们将他们加入列表理解中:
>>> chained = itertools.chain.from_iterable(sixbit)
>>> [''.join(bits) for bits in itertools.izip(*[chained]*8)]
['00001100', '00010101', '00100001']
答案 1 :(得分:2)
>>> [''.join(sixbit)[bit:bit + 8] for bit in range(0, len(sixbit) * 6, 8)]
['00001100', '00010101', '00100001']
用词语表示:bit
从0
到总位数,以8为增量,从连接的位串中取出bit
到bit + 8
。
答案 2 :(得分:2)
from itertools import *
def flatten(listOfLists):
"Flatten one level of nesting"
return chain.from_iterable(listOfLists)
def grouper(n, iterable, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
[''.join(a) for a in grouper(8, flatten(sixbit))]
=> ['00001100', '00010101', '00100001']
答案 3 :(得分:1)
所以,我认为目标是将第一个列表合并为一个字符串,然后将该字符串拆分为三个八个字符串。
sixbit = ['000011', '000001', '010100', '100001']
# Combine the first list into one string
tmp = "".join(sixbit)
# Split that string into three eight character strings
eightbit = [tmp[i:i+8] # get 8 characters from tmp, starting at position i
for i in range(0, len(tmp), 8)] # For each multiple of 8 (0, 8, 16..)