python如何删除项目_如何删除列表中存在的项目?

1) 几乎是英式风格:

使用in运算符测试是否存在,然后应用remove方法。if thing in some_list: some_list.remove(thing)

remove方法将只删除thing的第一个匹配项,为了删除所有匹配项,可以使用while而不是if。while thing in some_list: some_list.remove(thing)很简单,可能是我的选择。对于小列表(忍不住一句)

这种先问后问的态度在Python中很常见。不要预先测试对象是否合适,只需执行操作并捕获相关异常:try:

some_list.remove(thing)

except ValueError:

pass # or scream: thing not in some_list!

except AttributeError:

call_security("some_list not quacking like a list!")

当然,上面例子中的第二个except子句不仅具有可疑的幽默,而且完全没有必要(重点是为不熟悉这个概念的人演示duck typing)。

如果你希望多次发生这样的事情:while True:

try:

some_list.remove(thing)

except ValueError:

break对于这个特定的用例有点冗长,但是在Python中非常习惯。

这比1

PEP 463为try/提出了一个较短的语法,除了简单的用法之外,这在这里很方便,但是没有得到批准。with suppress(ValueError, AttributeError):

some_list.remove(thing)

同样,如果您希望多次出现以下情况:with suppress(ValueError):

while True:

some_list.remove(thing)

3) 功能风格:

大约在1993年,Python得到了lambda、reduce()、filter()和map(),这是一个Lisp黑客错过了它们并提交了工作补丁*。可以使用filter从列表中删除元素:is_not_thing = lambda x: x is not thing

cleaned_list = filter(is_not_thing, some_list)

有一个快捷方式可能对您的情况很有用:如果您想过滤掉空项(实际上是bool(item) == False的项,比如None、零、空字符串或其他空集合),则可以将None作为第一个参数传递:cleaned_list = filter(None, some_list)[更新]:在Python 2.x中,filter(function, iterable)过去等价于[item for item in iterable if function(item)](或者,如果第一个参数是None,则等价于[item for item in iterable if item]);在Python 3.x中,现在等价于(item for item in iterable if function(item))。微妙的区别在于,过滤器用于返回列表,现在它的工作方式类似于生成器表达式-如果您只是在已清理的列表上迭代并丢弃它,这是可以的,但是如果您真的需要列表,则必须用list()构造函数将filter()调用括起来。

*这些Lispy风格的构造在Python中被认为是有点异类。大约在2005年,Guido was even talking about dropping ^{}-连同同伴map和reduce(它们还没有消失,但是reduce被移到functools模块中,如果您喜欢的话,这值得一看)。

4) 数学风格:

自从2.0版由PEP 202引入以来,List comprehensions成为Python中列表操作的首选样式。它背后的基本原理是,列表理解提供了一种更简洁的方法,可以在当前使用map()和filter()和/或嵌套循环的情况下创建列表。cleaned_list = [ x for x in some_list if x is not thing ]

生成器表达式是由PEP 289在版本2.4中引入的。生成器表达式更适合于不需要(或不希望)在内存中创建完整列表的情况,比如只想一次遍历一个元素。如果只在列表上迭代,可以将生成器表达式视为lazy evaluated列表理解:for item in (x for x in some_list if x is not thing):

do_your_thing_with(item)

注释您可能希望使用不等式运算符!=,而不是is not(the difference is important)

对于暗示列表副本的方法的批评者:与流行的观点相反,生成器表达式并不总是比列表理解更有效-请在投诉之前进行简介

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值