2

次のような文字列のリストがあります。

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

このリストを反復処理して、次のような新しいリストを生成したいと思います。

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

説明のために、len(6 ビット) は 4 に等しくなります。これは、8 ビットにうまく変換されるためです。理想的には、sixbit は任意の長さにすることができます。eightbit が残りの 1 または 0 を「切り取る」場合は問題ありません。

これが私が試したコードです...悲しいことに、それはかなり外れていますが、私がやろうとしていることを見ることができるかもしれません. アイデアは、1) すべての数字を 1 つの大きな文字列に入れる 2) 各数字をループしてカウントを保持し、繰り返しながらホルダーに数字を収集する 3) カウント = 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タプルを返すだけで、最初のタプルにはパラメーター内の各連鎖反復子の最初の文字が含まれ、2 番目のタプルには 2 番目の文字が含まれます。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']

つまり、bitfrom0から合計ビット数まで、8刻みで、結合されたビット文字列からビットbitを取得します。bit + 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

したがって、目標は最初のリストを1つの文字列に結合し、次にその文字列を3つの8文字の文字列に分割することだと思います。

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 に答える