0

アレイを解凍する必要がありますが、どこから始めればよいかわかりません。

これが関数の入力です

def main():
    # Test case for Decompress function
    B = [6, 2, 7, 1, 3, 5, 1, 9, 2, 0]
    A = Decompress(B)
    print(A)

これを出して欲しい

A = [2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 9, 0, 0]

パターンが表示されない場合は、に表示されるB[1]回数、およびに表示される回数などです。B[2]A[]B[3]B[4]A[]

このための関数を作成するにはどうすればよいですか?

4

4 に答える 4

3

zip()とのコンパクトバージョンitertools.chain.from_iterable

from itertools import chain

list(chain.from_iterable([v] * c for c, v in zip(*([iter(B)]*2))))

デモ:

>>> B = [6, 2, 7, 1, 3, 5, 1, 9, 2, 0]
>>> from itertools import chain
>>> list(chain.from_iterable([v] * c for c, v in zip(*([iter(B)]*2))))
[2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 9, 0, 0]

これを分解する:

  • zip(*([iter(B)]*2)))ペアカウントと値:

    >>> zip(*([iter(B)]*2))
    [(6, 2), (7, 1), (3, 5), (1, 9), (2, 0)]
    

    反復可能な入力からペアを取得することは、かなり標準的なPythonのトリックです。

  • ([v] * c for c, v in zip(*([iter(B)]*2)))は、カウントと値を取得し、カウント回数が繰り返される値のリストを生成するジェネレータ式です。

    >>> next([v] * c for c, v in zip(*([iter(B)]*2)))
    [2, 2, 2, 2, 2, 2]
    
  • chain.from_iterableジェネレータ式によって生成されたさまざまなリストを取得し、それらを1つの長いリストであるかのように反復処理できます。

  • list()すべてをリストに戻します。

于 2013-03-22T15:47:04.360 に答える
1
def unencodeRLE(i):
    i = list(i) #Copies the list to a new list, so the original one is not changed.
    r = []

    while i:
        count = i.pop(0)
        n = i.pop(0)
        r+= [n for _ in xrange(count)]
    return r
于 2013-03-22T15:47:55.840 に答える
0

もう1つのワンライナー:

def decompress(vl):
    return sum([vl[i] * [vl[i+1]] for i in xrange(0, len(vl), 2)], [])
  1. リスト内包表記は、ペアを抽出して解凍します(xrange(0, len(vl), 2)ペアの開始インデックスを反復処理しvl[i]、繰り返し回数であり、vl[i+1]何を繰り返すかです)。

  2. sum()結果を結合します([]解凍されたリストが順番に追加される初期値です)。

于 2013-03-22T16:04:09.667 に答える
0

少し速いソリューション(Python 2.7.3を使用):

A=list(chain.from_iterable( [ B[i]*[B[i+1]] for i in xrange(0,len(B),2) ] ) )

>>> timeit.Timer(
        setup='B=[6,2,7,1,3,5,1,9,2,0];from itertools import chain',
        stmt='A=list(chain.from_iterable( [ B[i]*[B[i+1]] for i in xrange(0,len(B),2) ] ) )').timeit(100000)
0.22841787338256836

との比較:

>>> timeit.Timer(
        setup='B=[6,2,7,1,3,5,1,9,2,0];from itertools import chain',
        stmt='A=list(chain.from_iterable([v] * c for c, v in zip(*([iter(B)]*2))))').timeit(100000)
0.31104111671447754
于 2013-04-15T02:13:57.447 に答える