簡體   English   中英

替換列表中的所有其他 position

[英]Replacing every other position in a list

我正在嘗試制作一些東西,使我可以用單個項目替換列表中的所有其他 position:

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]

我嘗試了索引[::]的不同位置,但要么得到錯誤,要么得到不包括列表中 rest 的結果。

相反,我得到了這個:

ValueError: attempt to assign sequence of size 1 to extended slice of size 2

切片是正確的,但您需要提供一個包含足夠元素的序列來填充所有元素。

l[::2] = ["A"] * math.ceil(len(l)/)

編輯: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

老答案:

嘗試使用與enumerate配對的列表理解:

l = ["A" if i % 2 == 0 else elem for i, elem in enumerate(l)]

這將用字母“A”的奇數索引(奇數 % 2 將等於 0)替換每個元素,並將其余元素保持原樣。 Enumerate 循環遍歷原始的可迭代對象,但也包含一個索引元素。

您必須提供與要分配的項目一樣多的元素:

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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM