[英]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.