我需要解碼器接受輸入
[3, 15, 6, 4]
并輸出
[15, 15, 15, 4, 4, 4, 4, 4, 4]
我已經有一個可以完美運行的編碼器,但我不確定我將如何扭轉這個程序。
uj5u.com熱心網友回復:
您可以使用串列理解:
lst = [3, 15, 6, 4]
output = [x for n, x in zip(lst[::2], lst[1::2]) for _ in range(n)]
print(output) # [15, 15, 15, 4, 4, 4, 4, 4, 4]
uj5u.com熱心網友回復:
一種解決方案是使用嵌套list推導(即相當于兩個for回圈),遍歷 list 的偶數索引L:
>>> L = [3, 15, 6, 4]
>>> [e for i in range(0, len(L), 2) for e in L[i] * [L[i 1]]]
[15, 15, 15, 4, 4, 4, 4, 4, 4]
一種實作相同的方法,使用單個for回圈和list.extend:
>>> L = [3, 15, 6, 4]
>>> result = []
>>> for i in range(0, len(L), 2):
... result.extend(L[i] * [L[i 1]])
...
>>> result
[15, 15, 15, 4, 4, 4, 4, 4, 4]
uj5u.com熱心網友回復:
@j1-lee 的答案有效,但如果空間效率受到關注,則會創建臨時串列,這可能是一個問題。
您可以在輸入串列上創建一個迭代器,而不是以節省空間的方式遍歷串列:
lst = [3, 15, 6, 4]
seq = iter(lst)
print([i for n, i in zip(seq, seq) for _ in range(n)])
這輸出:
[15, 15, 15, 4, 4, 4, 4, 4, 4]
uj5u.com熱心網友回復:
有很多方法可以做到這一點。一種是串列乘法和求和:
sum((lst[n] * lst[n 1:n 2] for n in range(0, len(lst), 2)), start=[])
您也可以使用itertools.chain.from_iterable代替sum:
list(chain.from_iterable(lst[n] * lst[n 1:n 2] for n in range(0, len(lst), 2)))
您還可以使用itertools.repeat更懶惰地評估擴展:
list(chain.from_iterable(repeat(lst[n 1], lst[n]) for n in range(0, len(lst), 2)))
如果你愿意使用 numpy,你可以這樣做
np.repeat(lst[1::2], lst[::2])
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/515884.html
