将 python 列表转换为 [[index] * value ] 扁平化
Transform a python list to [[index] * value ] flattened
我有一个列表,想要将列表转换为 [[index] * value]
扁平化。
例如,如果输入是 [1, 2, 3, 1]
,输出应该是 [0, 1, 1, 2, 2, 2, 3]
。我可以想象做以下事情。
A = [1, 2, 3, 1]
result = []
for i,n in enumerate(A):
result += [i] * n
result
就是我想要的输出。但如您所见,解决方案并不是很优雅。如何做得更好?
您可以使用嵌套列表理解:
lst = [1, 2, 3, 1]
output = [i for i, x in enumerate(lst) for _ in range(x)]
print(output) # [0, 1, 1, 2, 2, 2, 3]
使用 itertools
函数的一些方法,尽管我认为您的循环非常好,如果 j1-lee 的循环还没有,我可能已经写好了。
from itertools import chain, repeat, count, starmap
result = [*chain(*map(repeat, count(), A))]
result = list(chain.from_iterable(map(repeat, count(), A)))
result = list(chain.from_iterable(starmap(repeat, enumerate(A))))
我有一个列表,想要将列表转换为 [[index] * value]
扁平化。
例如,如果输入是 [1, 2, 3, 1]
,输出应该是 [0, 1, 1, 2, 2, 2, 3]
。我可以想象做以下事情。
A = [1, 2, 3, 1]
result = []
for i,n in enumerate(A):
result += [i] * n
result
就是我想要的输出。但如您所见,解决方案并不是很优雅。如何做得更好?
您可以使用嵌套列表理解:
lst = [1, 2, 3, 1]
output = [i for i, x in enumerate(lst) for _ in range(x)]
print(output) # [0, 1, 1, 2, 2, 2, 3]
使用 itertools
函数的一些方法,尽管我认为您的循环非常好,如果 j1-lee 的循环还没有,我可能已经写好了。
from itertools import chain, repeat, count, starmap
result = [*chain(*map(repeat, count(), A))]
result = list(chain.from_iterable(map(repeat, count(), A)))
result = list(chain.from_iterable(starmap(repeat, enumerate(A))))