我正在嘗試制作一些東西,允許我用單個專案替換串列中的所有其他位置:
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
l[::2] = "A"
print(l)
我期待類似的東西:
["A", 1, "A," 3, "A", "A", 6, "A", 8, "A", 10]
我嘗試了不同的索引位置,[::]但要么得到錯誤,要么得到不包括串列其余部分的結果。
相反,我得到了這個:
ValueError: attempt to assign sequence of size 1 to extended slice of size 2
uj5u.com熱心網友回復:
切片是正確的,但您需要提供一個包含足夠元素的序列來填充所有元素。
l[::2] = ["A"] * math.ceil(len(l)/2)
uj5u.com熱心網友回復:
編輯:Barmar 的答案要好得多,只要您可以匯入數學庫。
10,000 個回圈的粗略速度比較(假設您沒有將串列變成生成器,否則串列理解總體上會稍微快一些):
import math, time
def slicing(n):
for _ in range(n):
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
l[::2] = ["A"] * math.ceil(len(l)/2)
def comprehension(n):
for _ in range(n):
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
l = ["A" if i % 2 == 0 else elem for i, elem in enumerate(l)]
start = time.time()
slicing(10000)
print(f'Using slicing and math.ceil: {time.time() - start} seconds')
start = time.time()
comprehension(10000)
print(f'Using list comprehension: {time.time() - start} seconds')
>>> Using slicing and math.ceil: 0.004003286361694336 seconds
>>> Using list comprehension: 0.012019157409667969 seconds
編輯#2:對于任何想知道的人,Alain 的回答平均每 10,000 次回圈大約需要 0.0075 秒,所以基本上就在中間。
舊答案:嘗試使用與enumerate配對的串列理解:
l = ["A" if i % 2 == 0 else elem for i, elem in enumerate(l)]
這將用字母“A”的奇數索引(奇數 % 2 將等于 0)替換每個元素,并將其余元素保持原樣。Enumerate 回圈遍歷原始的可迭代物件,但也包含一個索引元素。
uj5u.com熱心網友回復:
您必須提供與要分配的專案一樣多的元素:
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
l[::2] = ("A" for _ in l[::2])
print(l)
['A', 1, 'A', 3, 'A', 5, 'A', 7, 'A', 9, 'A']
或者這樣:
l[::2] = ["A"]*len(range(0,len(l),2))
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/420232.html
標籤:
上一篇:解釋輸出會是什么
