-1

ランレングス エンコーディングを使用してリストを圧縮するプログラムを作成する必要があります。私はそれを行う方法がわかりません。プログラムを少しずつ変更した後、今何をしているのかさえわかりません。

ライブラリをインポートしたり、Python 文字列やリスト オブジェクト メソッド ( などappend()) を使用したりすることはできません。

これは私が今いるところです:

def rle(x):
    c_list = []
    count = 0 
    for num in x: 
        if x[num] == x[num - 1]:
            c+=[x[num], count]
            count+= 1
     # ...
     return c

このリストを例として使用します。

[8,8,8,4,5,5,5,6,6,6,6,9,8,1,1,1,1,3,3]

これは次のように返されます:

[6, 0, 6, 1, 6, 2, 5, 3, 5, 4, 5, 5, 5, 6, 
5, 7, 5, 8, 5, 9, 6, 10, 6, 11, 8, 12, 8,
13, 8, 14, 8, 15] 

これは明らかに外れています。

4

2 に答える 2

1

エンコーディングはどうあるべきですか?のタプルを想定すると(element, count)、ジェネレーターを実装できます。

def rle(iterable):
    it = iter(iterable)
    e, c = next(it), 1       # StopIteration silently handled before Py3.7
    for n in it:
        if n == e:
            c += 1
            continue
        yield (e, c)         # "yield from (e, c)" if you need a flat list
        e, c = n, 1
    yield (e, c)

>>> list(rle('aaaaaddddffgghjjjjj'))
[('a', 5), ('d', 4), ('f', 2), ('g', 2), ('h', 1), ('j', 5)]
>>> list(rle([8,8,8,4,5,5,5,6,6,6,6,9,8,1,1,1,1,3,3]))
[(8, 3), (4, 1), (5, 3), (6, 4), (9, 1), (8, 1), (1, 4), (3, 2)]
于 2015-10-21T04:24:20.623 に答える
0
def rle(x):
    prev = x[0]
    count = 0
    for item in x:
        if item == prev:
            count += 1
        else:
            yield prev, count
            prev = item
            count = 1
    yield prev, count

x = [8,8,8,4,5,5,5,6,6,6,6,9,8,1,1,1,1,3,3] 
print list(rle(x))

版画

[(8, 3), (4, 1), (5, 3), (6, 4), (9, 1), (8, 1), (1, 4), (3, 2)]

必要な場合

[8, 3, 4, 1, 5, 3, 6, 4, 9, 1, 8, 1, 1, 4, 3, 2]

yieldそれぞれを2に置き換えるだけですyields

yield prev
yield count
于 2015-10-21T04:26:13.250 に答える