lst = ['apple', 'orange', 'kiwi', 'ananas',
'tea', 'coffee', 'milk', 'love', 'peace']
for i in range(len(lst)):
if (i 1) % 2 == 0:
lst.append(lst[i])
lst.pop(i)
基本上在這里,我希望將具有偶數索引的專案添加到此串列的末尾,它適用于第二個專案,但仍然不適用于其余專案
uj5u.com熱心網友回復:
您可以使用 Python 更寬的步長范圍:
lst = lst[1::2] lst[0::2]
加號的右側表示“從第一個開始抓取每個第二個元素”,左側表示“從第二個開始抓取每個第二個元素”。這基本上用奇數元素和偶數元素最后重建串列。
它甚至避免了使您的參考演算法 O(n^2)
uj5u.com熱心網友回復:
您的方法的問題是元素在您移動第一個元素后發生了變化。因此,當您位于具有“偶數”索引的下一個元素時,該元素最初位于奇數索引處。因此,在您移動第一個元素后,您可以直接繼續使用下一個索引處的元素,該索引以前是兩個索引,然后再次下一個,依此類推,串列中索引的一半。
這是一個示例,使用數字串列,以便更容易看到發生了什么。如果您想要奇數索引,請使用range(1, len(lst)//2 1).
lst = list(range(10))
for i in range(len(lst)//2):
lst.append(lst.pop(i))
# [1, 3, 5, 7, 9, 0, 2, 4, 6, 8]
然而,即使這樣可行,在迭代串列的同時修改串列通常是一個非常糟糕的主意,會導致很多麻煩。此外,重復pop(i)使整個操作為 O(n2)。
相反,將串列的兩個部分組合起來會更快、更明智:
lst = list(range(10))
lst = lst[1::2] lst[0::2]
# [1, 3, 5, 7, 9, 0, 2, 4, 6, 8]
(如果您需要“就地”更改串列,例如由于其他參考指向該串列,您可以使用對切片的賦值替換串列的內容:lst[:] = ...。這仍然不是“就地”在不使用額外記憶體的意義上。但如果串列太大以至于這是一個問題,那么 O(n2) 運行時間可能會是一個更大的問題。)
uj5u.com熱心網友回復:
一種簡單的方法是使用推導式構建一個新串列:
lst2 = [v for i, v in enumerate(lst) if i%2 == 0] \
[v for i, v in enumerate(lst) if i%2 != 0]
但是可以就地更改串列。規則是從串列的末尾開始,以便在洗掉元素時不改變索引的奇數
last = len(lst) - 1 # when an element is popped, the list loses one element
for i in range(len(lst), 0, -1):
if (i % 2) == 0:
val = lst.pop(i - 1) # remove element with even index
lst.insert(last, val) # insert it before last inserted
last -= 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/478413.html
標籤:Python python-3.x 列表 算法
下一篇:演算法問題:均勻噪聲二值影像分類
