我想创建一个列表,其中包含来自wc
list1
预期列表应该有3个零,5个,4个,等等。
list1 = [3,5,4,1,2,2]
答案 0 :(得分:5)
您可以使用range
使用嵌套的列表理解进行重复:
lst = [i for i in range(len(list1)) for _ in range(list1[i])]
print lst
# [0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 4, 4, 5, 5]
还有更直观的itertools
方法:
from itertools import repeat, count
c = count()
lst = [x for i in list1 for x in repeat(next(c), i)]
答案 1 :(得分:4)
您可以使用列表解析来执行此操作,但使用传统的for
循环和.extend
方法会更有效。
list1 = [3,5,4,1,2,2]
list2 = []
for i, v in enumerate(list1):
list2.extend([i] * v)
print(list2)
<强>输出强>
[0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 4, 4, 5, 5]
另一种选择是使用itertools.chain
:
list2 = list(chain.from_iterable([i] * v for i, v in enumerate(list1)))
或者,略短,但更隐蔽
list2 = list(chain(*([i] * v for i, v in enumerate(list1))))
答案 2 :(得分:2)
您可以使用列表推导和enumerate()
来迭代计数/值对:
>>> list1 = [3, 5, 4, 1, 2, 2]
>>> [j for i, n in enumerate(list1) for j in [i]*n]
[0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 4, 4, 5, 5]
或者,您可以使用itertools.chain
(或chain.from_iterable
),尤其是如果您不总是需要在内存中构建列表:
>>> from itertools import chain
>>> list(chain(*[[i]*n for i, n in enumerate(list1)]))
[0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 4, 4, 5, 5]