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