所以我正在嘗試撰寫一個函式 selected(lst:list[int]) -> list[int] ,它回傳一個串列,該串列包含 lst 的所有元素,但前面的元素、中間的元素和最后一個元素。你可以假設 lst 的長度大于 3 并且總是奇數。
例如, selected([9,3,5,7,1]) 回傳 [3,7] 和 selected([0,2,7,0,0,5,0,0,0]) 回傳 [2, 7,0,5,0,0]。到目前為止,這是我的代碼......
def first(lst: list) -> list:
if len(lst)%2 == 0:
lst.remove(lst[0])
lst.remove(lst[len(lst)//2])
lst.remove(lst[-1])
else:
lst.remove(lst[0])
lst.remove(lst[(len(lst) // 2)-1])
lst.remove(lst[-1])
return lst
我應該改變什么以確保這有效?
uj5u.com熱心網友回復:
從最后一個洗掉否則索引將不正確
l = [9,3,5,7,1]
indices_to_be_poped = [0, len(l)//2, len(l)-1]
for i in indices_to_be_poped[::-1]:
l.pop(i)
print(l) #[3, 7]
uj5u.com熱心網友回復:
一種方法:
def chosen(lst):
indices = [0, len(lst) // 2, len(lst) - 1]
return [v for i, v in enumerate(lst) if i not in indices]
res = chosen([9,3,5,7,1])
print(res)
輸出
[3, 7]
這個想法是首先選擇要洗掉的索引,然后簡單地過濾掉這些索引處的元素。
請注意,remove, 實際上是從串列中洗掉其值等于 x 的第一項。因此,您的方法不適用于重復值。
uj5u.com熱心網友回復:
您可以使用元組解包來洗掉第一項和最后一項。然后彈出中間元素。
def chosen(lst):
_, *out, _ = lst
out.pop(len(out)//2)
return out
chosen([9,3,5,7,1])
# [3, 7]
uj5u.com熱心網友回復:
您可以使用list.pop(index)函式通過提供索引值來洗掉元素。
請注意,您需要提供從最大到最低的索引,因為一旦您洗掉一個元素,串列就會重新索引,并且元素索引會發生變化
# your code goes here
def chosen(array: list):
length = len(array)
remove = [length-1, length//2, 0]
for i in remove:
array.pop(i)
return array
assert chosen([0,2,7,0,0,5,0,0,0]) == [2,7,0,5,0,0]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/368801.html
上一篇:在串列中找到最長的重復序列
