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获取由生成器表达式生成的各种列表,并让您遍历它们,就好像它们是一个长列表一样。

  • 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

一个稍快的解决方案(使用 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 回答
0

还有一个单行:

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 回答