sol*_*les 31 python list nonetype
我在Python中使用Beautiful Soup来从HTML文件中删除一些数据.在某些情况下,Beautiful Soup会返回包含两者string
和NoneType
对象的列表.我想过滤掉所有的NoneType
对象.
在Python中,包含NoneType
对象的列表不可迭代,因此列表推导不是一个选项.具体来说,如果我有一个lis
包含的列表NoneTypes
,并且我尝试做类似的事情[x for x in lis (some condition/function)]
,Python会抛出错误TypeError: argument of type 'NoneType' is not iterable
.
正如我们在其他帖子中看到的那样,在用户定义的函数中实现此功能非常简单.这是我的味道:
def filterNoneType(lis):
lis2 = []
for l in links: #filter out NoneType
if type(l) == str:
lis2.append(l)
return lis2
Run Code Online (Sandbox Code Playgroud)
但是,如果它存在,我很乐意使用内置的Python函数.我总是希望在可能的情况下简化我的代码.Python有内置函数可以NoneType
从列表中删除对象吗?
Abs*_*Abs 60
我认为最简洁的方法是:
#lis = some list with NoneType's
filter(None, lis)
Run Code Online (Sandbox Code Playgroud)
Cha*_*guy 23
你可以使用列表理解来做到这一点:
clean = [x for x in lis if x != None]
Run Code Online (Sandbox Code Playgroud)
正如您在注释中所指出的那样is not
,即使它基本上编译为相同的字节码:
clean = [x for x in lis if x is not None]
Run Code Online (Sandbox Code Playgroud)
您也可以使用filter
(注意:这也将过滤空字符串,如果您想要更多地控制过滤器可以传递函数而不是None
):
clean = filter(None, lis)
Run Code Online (Sandbox Code Playgroud)
如果你想要更高效的循环,总会有itertools方法,但这些基本方法应该适用于大多数日常情况.
UPD 2021:
在编写此答案时,提议的实现在语言语义方面绝对有效,但显然是一个黑客攻击。从那时起事情发生了变化,从 Python 3.9 开始,NotImplemented
明确不鼓励在布尔上下文中评估。这是 Python 文档的摘录:
不推荐在布尔上下文中评估 NotImplemented。虽然它当前评估为 true,但它会发出 DeprecationWarning。它会在 Python 的未来版本中引发 TypeError。
为了历史,我会保留这个答案,但请注意,即使到了这个时候,这也有点不合时宜。根据您的要求坚持建议的列表理解解决方案或filter
+ lambda
。
原始答案:
截至 2019 年初,Python 没有用于过滤 None 值的内置函数,这避免了删除零、空字符串等常见的陷阱。
在 Python3 中,您可以使用 .__ne__
dunder 方法(或“魔术方法”,如果您愿意的话)来实现它:
>>> list1 = [0, 'foo', '', 512, None, 0, 'bar']
>>> list(filter(None.__ne__, list1))
[0, 'foo', '', 512, 0, 'bar']
Run Code Online (Sandbox Code Playgroud)
这是它的工作原理:
None.__ne__(None)
--> 错误
None.__ne__(anything)
--> 未实现
NotImplemented
有效的例外是True
,例如:
>>> bool(None.__ne__('Something'))
True
Run Code Online (Sandbox Code Playgroud)
清单理解,作为其他建议的答案,或者出于完整性考虑:
clean = filter(lambda x: x is not None, lis)
Run Code Online (Sandbox Code Playgroud)
如果列表很大,则迭代器方法会更好:
from itertools import ifilter
clean = ifilter(lambda x: x is not None, lis)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
43071 次 |
最近记录: |