列表中的Python3 del对象

时间:2018-10-15 10:09:45

标签: python 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]中删除带有索引的

3 个答案:

答案 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]