在Python中迭代非None项

bre*_*den 6 python

我有一个字符串列表,其中一些恰好是None:

headers = ['Name', None, 'HW1', 'HW2', None, 'HW4', 'EX1', None, None]
Run Code Online (Sandbox Code Playgroud)

现在我想迭代这个列表,但跳过None条目.例如,像这样的东西会很好:

for header in headers if header: print(header)
Run Code Online (Sandbox Code Playgroud)

但这不起作用.有两种方法我可以使用它,但我不喜欢这两种方法:

for header in (item for item in headers if item): print(header)
Run Code Online (Sandbox Code Playgroud)

for header in headers:
    if header: print(header)
Run Code Online (Sandbox Code Playgroud)

我只是好奇是否有更好的方法.我觉得无视无.应该是非常基本的.

Łuk*_*ski 11

headers = ['Name', None, 'HW1', 'HW2', None, 'HW4', 'EX1', None, None]
for header in filter(None, headers):
    print header
Run Code Online (Sandbox Code Playgroud)

  • 请注意,因为这不是对非`None'的事物进行迭代,如文档所述:“如果function为None,则假定为identity函数,也就是说,将所有false的iterable元素都删除。”。等同于[[x代表x表示x,如果x不是]]与`[[x等于x表示x in headers]。您想要的可能是这样的:`filter(lambda x:x不是None,标题)`,甚至是理解力。在许多情况下,这可能不会有太大变化,但是如果您处理数字,则将全0删除。在您的情况下,所有空标题“””将被删除。 (3认同)

Dav*_*542 6

None您可以使用列表理解来删除项目:

headers = [item for item in headers if item is not None]
for item in header:
    print item
Run Code Online (Sandbox Code Playgroud)


Ran*_*niz 5

你可以使用filter:

headers = filter(None, headers)
Run Code Online (Sandbox Code Playgroud)