遍历字符串列表并组合字符串值Python

2024-06-25 23:32:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我想迭代这个列表并生成一个如下所示的新列表:

^{pr2}$

为了便于说明,len(sixbit)等于4,因为这可以很好地转换成8位。理想情况下,6位可以是任意长度的——如果eightbit“切断”任何剩余的1或0,那就没问题了

下面是我尝试过的一些代码…很遗憾,它离我很远,但也许你能看到我在做什么。其思想是1)将所有数字放入一个大字符串中2)在每个数字上循环并保持计数,在迭代时将数字收集到holder中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

Tags: 字符串列表stringlencounter数字templist
3条回答
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']
>>> [''.join(sixbit)[bit:bit + 8] for bit in range(0, len(sixbit) * 6, 8)]
    ['00001100', '00010101', '00100001']

从^{cd2>的比特数到^{cd2>的比特数。在

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

解释

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

^{pr2}$

[chained]*8创建包含相同对象的列表8次。在

*只需将这8个元素解压为^{}参数。在

^{}只返回元组,其中第一个元组包含参数中每个链式迭代器的第一个字母,第二个元组包含第二个字母等。有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']

相关问题 更多 >