2

我有一个字符串列表,如下所示:

    sixbit = ['000011', '000001', '010100', '100001']

我想遍历这个列表并生成一个看起来像这样的新列表:

    eightbit = ['00001100', '00010101', '00100001']

出于说明的目的,len(sixbit) 等于 4,因为它可以很好地转换为八位。理想情况下,六位可以是任何长度——如果八位“切断”任何剩余的 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
4

4 回答 4

5
>>> chained = itertools.chain.from_iterable(sixbit)
>>> [''.join(bits) for bits in itertools.izip(*[chained]*8)]
['00001100', '00010101', '00100001']

解释

chained只是原始字符串的所有字母的迭代器。它使用chained来自 的函数itertools

>>> 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']
于 2013-03-14T19:54:59.643 回答
2
>>> [''.join(sixbit)[bit:bit + 8] for bit in range(0, len(sixbit) * 6, 8)]
    ['00001100', '00010101', '00100001']

换句话说:对于bit0到总位数,以 8 为增量,从连接的位串中取bitbit + 8

于 2013-03-14T19:50:53.917 回答
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']
于 2013-03-14T19:50:56.407 回答
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..)
于 2013-03-14T19:51:14.193 回答