从另一个列表中创建有关数字的重复连续数字列表

时间:2017-06-05 11:15:29

标签: python

我想创建一个列表,其中包含来自wc

的数字的零重复连续数字
list1

预期列表应该有3个零,5个,4个,等等。

list1 = [3,5,4,1,2,2]

3 个答案:

答案 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]