在Python中解压数组

2024-06-10 13:02:40 发布

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

我需要解压缩一个数组,我不知道从哪里开始。在

这是函数的输入

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

我要这个出来

^{pr2}$

如果看不到模式,B[1]B[2]A[]中出现的次数,B[3]是{}在A[]中出现的次数,依此类推。在

我怎么写这个函数?在


Tags: 函数testformaindef模式function数组
3条回答

再来一个班轮:

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()将结果连接在一起([]是未打包列表按顺序添加到的初始值)。

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

带有zip()itertools.chain.from_iterable的精简版:

from itertools import chain

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

演示:

^{pr2}$

分解:

  • zip(*([iter(B)]*2)))对的计数为:

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

    从输入iterable中获取对是一个相当标准的Python技巧。

  • ([v] * c for c, v in zip(*([iter(B)]*2)))是一个生成器表达式,它获取计数和值,并生成值为repeated count times的列表:

    >>> next([v] * c for c, v in zip(*([iter(B)]*2)))
    [2, 2, 2, 2, 2, 2]
    
  • chain.from_iterable获取生成器表达式生成的各种列表,并允许您对它们进行迭代,就像它们是一个长列表一样。

  • list()将其全部还原为一个列表。

相关问题 更多 >