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]
任务
我有一个大小为
的数组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]