Python 3.6 从具有大小的数组创建映射

Python 3.6 Create mapping from an array with sizes

任务

我有一个大小为

的数组
sizes = [5, 3, 1, 2]

并根据我想要创建以下数组的大小

mapping = [0, 0, 0, 0, 0, 1, 1, 1, 2, 3, 3]

解决方案

我的第一次尝试

mapping = []
ctr = 0
for i in range(len(sizes)):
    for j in range(sizes[i]):
        mapping.append(i)
        ctr += 1

较短的版本

mapping = [[i for _ in range(sizes[i])] for i in range(len(sizes))]
mapping = list(itertools.chain(*mapping))

问题

一行版?

是否可以用简洁的代码在一行中完成?

使用enumerate

例如:

sizes = [5, 3, 1, 2]
result = [i for i, v in enumerate(sizes) for _ in range(v)]
print(result)

输出:

[0, 0, 0, 0, 0, 1, 1, 1, 2, 3, 3]

另一种方法是将索引乘以子列表[[0, 0, 0, 0, 0], [1, 1, 1], [2], [3, 3]] 然后用 itertoo.chain.from_iterable:

压平结果
>>> from itertools import chain
>>> sizes = [5, 3, 1, 2]
>>> list(chain.from_iterable([i] * x for i, x in enumerate(sizes)))
[0, 0, 0, 0, 0, 1, 1, 1, 2, 3, 3]