Python中从列表中移除项目

3

我是Python的新手,想知道如何从列表中删除项目。比如我有以下列表:

a=[(102,12,0),(123,12,0),(124,12,1)]

我想要删除以0结尾的项目,这样我的列表就会像这样:

a = [(124,12,1)]
3个回答

6

在这里:

a = [i for i in a if i[-1] != 0] #list comprehension (1 line) method.

当父列表也是目标列表时,没有列表推导式的“正常”方法。
tmp = []
for i in a:
    if i[-1] != 0:
        tmp.append(i)
a = tmp

实际应用:

>>> a=[(102,12,0),(123,12,0),(124,12,1)]
>>> a = [i for i in a if i[-1] != 0]
>>> a
[(124, 12, 1)]
>>> 

1
你可能想要解释一下列表推导式。 - Gareth Latty
你也可以使用 for i in a.copy(): \n if i[-1] == 0: \n a.remove(i) - user1632861
@Mahi 有很多种解决这种特定类型问题的方法,适当的方法取决于列表数据结构(在本例中为列表 - 但它也可以是字典、哈希库等等),删除、添加、创建或迭代的昂贵程度。此外,我们是否删除的比添加的多?没有“通用最佳”解决方案,但列表推导做得很好,而且足够通用和简单,大多数情况下非常高效。但感谢你提供额外的选项。 - Inbar Rose
1
@InbarRose 是的,我完全同意列表推导式是最好的解决方案!但对于“正常”的方法,我更喜欢使用.copy() & .remove()而不是tmp & .append()。只是发表一下我的观点 :) - user1632861
在这种情况下,为什么不使用iteritems并删除呢?(for i in iter(a): \n if i[-1] == 0: \n a.remove(i)) - Inbar Rose
1
删除并不是一个很好的方法,因为它会增加计算复杂度。从列表中删除一个项目需要遍历整个列表以查找该项目,因此循环和删除需要对列表进行一次遍历,再加上每次删除所需的一次遍历,而创建一个新列表只需要一次循环(列表推导式同样如此,但由于循环在C端执行,因此速度更快)。 - Gareth Latty

2

您可以使用列表推导式

假设您在迭代时使用变量val,则val[-1]将会给您以0结尾的元组。

因此,您的代码应该像这样:

a = [val for val in a if val[-1]]

请注意,如果元组中包含非数字元素,则会删除诸如None或空集合(任何评估为False的内容)。 - Gareth Latty

1

虽然不如一行代码的列表推导式那么棒,但仍然能够胜任 :)

b = tuple
for tple in a:
    b = b + tple
result = tuple
for val in set(b):
    if val % 10 != 0:
        result = result + (val,)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接