我正在尝试在循环中的列表中删除对象,但是它不起作用。
data = []
data.append({
'one': 1,
'two': 2
})
data.append({
'one': 3,
'two': 4
})
data.append({
'one': 5,
'two': 6
})
for d in data:
if d['one'] == 3:
del d
不可能像这样删除我的对象吗? del d
我找到的唯一解决方案是创建一个计数器,然后在数据列表del data[x]
中删除带有索引的
答案 0 :(得分:2)
del d
取消绑定名称d
,该名称只是对data
中其中一个词典的另一个引用。由于引用是独立分配和解除绑定的(请参阅此classic),因此您不会看到data
的任何更改。
通常,error prone是在列表上进行迭代时从列表中删除项目。
从数百年的Python编程中获得的传统智慧说,要建立一个新列表并重新命名。
>>> data = [d for d in data if d['one'] != 3]
>>> data
[{'two': 2, 'one': 1}, {'two': 6, 'one': 5}]
答案 1 :(得分:1)
您可以使用filter:
data = filter(lambda x: x['one'] != 3, data)
答案 2 :(得分:1)
在遍历列表时,无法从列表中删除项目,因为列表索引会在删除元素时发生变化。此外,del d
只是删除了名称d
,该字典仍将存在于列表中。
这里最好的解决方案是创建一个新列表,其中过滤掉了不需要的元素:
data = [d for d in data if d['one'] != 3]
如果修改现有列表data
很重要,因为对它的其他引用也必须看到更改,则可以使用切片分配来更新原始列表,但是通常不需要这样做:< / p>
data[:] = [d for d in data if d['one'] != 3]