簡體   English   中英

刪除Python中列表的最后一個元素失敗

[英]Removing last element of a list in Python fails

我正在嘗試刪除Python中列表的最后一個元素:

di = {"a": 3, "children": [{"b": 5}, {"c": 6}]}
for el in di['children']:
  di['children'].remove(el)

我期待的是

print di
{'a': 3, 'children: []}

但我得到的是

print di
{'a': 3, 'children': [{'c': 6}]}

有人知道出了什么問題嗎?

正如其他人所解釋的那樣,您無法在迭代時修改列表。

您可以在迭代它的副本時修改列表,但最好只生成一個新的過濾列表:

di = {"a": 3, "children": [{"b": 5}, {"c": 6}]}
di['children'] = [el for el in di['children'] if el not in di['children']]

為什么這樣更好? 好吧,這意味着你要避免改變列表,這使你的代碼更易於推理,更容易追蹤,通常更容易編寫,而且通常更快,更節省空間。 事實上,您不必擔心迭代變異問題,這是“更容易推理”部分的完美示例。

在某些情況下,它確實更難寫,或更慢,或更少節省空間,這就是為什么這只是一個指導而不是硬規則。 但它總是至少值得思考“我可以將其重寫為不可變過濾器而不是變換器”,即使答案有時可能變成“不”。

還真的,是不是你的算法保證等同於將整個事情清空? 在這種情況下:

di = {"a": 3, "children": [{"b": 5}, {"c": 6}]}
di['children'] = []

在迭代時不應修改列表。 你應該迭代一個副本。 請參閱python文檔

嘗試這個...

di = {"a": 3, "children": [{"b": 5}, {"c": 6}]}
for el in di['children'][:]:
    di['children'].remove(el)

您正在迭代它時修改列表 - 當您刪除第一個條目時,第二個條目成為第一個,並且已到達列表的末尾。 相反,使用:

del di["children"][:]

這將保留原始列表(與di["children"] = [] )因此,如果您有其他引用它們,它們也將反映截斷。

您只能在向后瀏覽列表時刪除循環中的元素。

所以我認為只需將di ['children']包裝在reverse()迭代器中就像這樣

for el in reversed(di['children']):

這是因為刪除元素會導致元素的編號變化,並且所有后續元素的數字都會減去1.但是,如果你向后移動,你不應該關心以下元素的索引,只關心刪除前的元素。

你在迭代它時修改列表,這是一個壞主意。

嘗試迭代列表的副本,同時從原始元素中刪除元素。

del di['children'][1]

刪除列表中的最后一個元素。

 for i in di:
    if type(di[i])==list:
       di[i]=[]

暫無
暫無

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

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