首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表中的Python3 del对象

列表中的Python3 del对象
EN

Stack Overflow用户
提问于 2018-10-15 10:09:44
回答 3查看 110关注 0票数 0

我试图在循环中的列表中建模一个对象,但它不起作用。

代码语言:javascript
复制
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]中的索引。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-15 10:13:49

del d解除对名称d的绑定,这只是对data中的一个字典的另一个引用。由于引用是独立地重新分配和解除绑定的(请参阅此古典主义),您将不会看到对data的任何更改。

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

从数百年的编程经验来看,Python的传统观点是建立一个新的列表并重新绑定名称。

代码语言:javascript
复制
>>> data = [d for d in data if d['one'] != 3]
>>> data
[{'two': 2, 'one': 1}, {'two': 6, 'one': 5}]
票数 2
EN

Stack Overflow用户

发布于 2018-10-15 10:13:42

您可以使用过滤器

代码语言:javascript
复制
data = filter(lambda x: x['one'] != 3, data)
票数 1
EN

Stack Overflow用户

发布于 2018-10-15 10:14:43

在迭代列表时,不能从列表中删除项目,因为列表索引随删除元素的变化而变化。此外,del d只需删除名称d,字典仍将存在于列表中。

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

代码语言:javascript
复制
data = [d for d in data if d['one'] != 3]

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

代码语言:javascript
复制
data[:] = [d for d in data if d['one'] != 3]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52814341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档