我想从零级有关的数字从创建重复的连续编号列表创建关于数字重复的连续号码列表list1
从另一个列表中
list1 = [3,5,4,1,2,2]
预计名单应该有3个零,5分的人,4个三三两两, 等等。
list2 = [0,0,0,1,1,1,1,1,2,2,2,2,3,4,4,5,5]
我想从零级有关的数字从创建重复的连续编号列表创建关于数字重复的连续号码列表list1
从另一个列表中
list1 = [3,5,4,1,2,2]
预计名单应该有3个零,5分的人,4个三三两两, 等等。
list2 = [0,0,0,1,1,1,1,1,2,2,2,2,3,4,4,5,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 – e4c5
你可以做到这一点列表理解,但使用传统的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))))
FWIW,我没有从eugene那里拷贝最后一个,我独立写了它。 –
你可以使用一个列表的理解和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]
我认为你的list comp比Moses更有效率,因为它避免了内部'range'调用。 –
@ PM 2Ring:是的,在我的机器上它更快:'%timeit [我为我在范围内(len(list1))为_范围内(list1 [i])] {...} 100000循环,最好是3 :每循环2.73μs%timeit [j为i,n为枚举(list1),j为[i] * n] {...} 1000000个循环,最好为3:每循环1.74μs –
请张贴您的尝试。 – Maroun