我想從零級有關的數字從創建重複的連續編號列表創建關於數字重複的連續號碼列表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