Python3 del object from list



我正在尝试在我的循环中破坏列表中的对象,但它不起作用。

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]

del d解绑了名称d,这只是对data中字典之一的另一个引用。由于引用是独立重新分配和取消绑定的(请参阅此经典(,因此您不会看到对data的任何更改。

通常,在迭代列表时从列表中删除项目容易出错。

从数百年的编程Python中获得的传统智慧说,建立一个新的列表并重新绑定名称。

>>> data = [d for d in data if d['one'] != 3]
>>> data
[{'two': 2, 'one': 1}, {'two': 6, 'one': 5}]

您可以使用过滤器:

data = filter(lambda x: x['one'] != 3, data)

在循环访问列表时,无法从列表中删除项目,因为列表索引会随着您删除元素而更改。同样del d简单地删除名称d,字典仍将存在于列表中。

这里最好的解决方案是创建一个新列表,过滤掉不需要的元素:

data = [d for d in data if d['one'] != 3]

如果修改现有列表很重要data因为有其他引用也必须看到更改,则可以使用切片分配来更新原始列表,但通常不需要这样做:

data[:] = [d for d in data if d['one'] != 3]

最新更新