为什么这个列表理解不能做我期望它做的事情?

Piz*_*zra 3 python list-comprehension

原始列表project_keys = sorted(projects.keys())[101, 102, 103, 104, 105, 106, 107, 108, 109, 110]今年以下项目被认为的地方invalid:108,109,110.

从而:

for project in projects.itervalues():
# The projects dictionary is mapped to the Project class
    if project.invalid:
    # Where invalid is a Bool parameter in the Project class
     project_keys.remove(project.proj_id)  

print project_keys
Run Code Online (Sandbox Code Playgroud)

这将返回一个整数列表(项目ID为):

[101, 102, 103, 104, 105, 106, 107]

甜.

现在,我希望它使用列表理解尝试相同的事情.

project_keys = [project_keys.remove(project.proj_id) for project in projects.itervalues() if project.invalid  

print project_keys
Run Code Online (Sandbox Code Playgroud)

返回:

[None, None, None]

所以我填充的列表与删除的元素具有相同的数字,但它们是None

有人可以指出我做错了吗?

另外,为什么我会for-if在顶部的块上使用列表理解?简明?看起来更好?

Mar*_*ers 6

您的列表理解使用副作用.只是执行它应该更新project_keys以提供您想要的结果.

[project_keys.remove(project.proj_id)
 for project in projects.itervalues()
 if project.invalid]
Run Code Online (Sandbox Code Playgroud)

来自的返回值removeNone.将列表推导的结果分配给project_keys您出错的地方.

一个简单的循环可能在这里更清楚.使用副作用的列表理解可能会令人困惑.

但是,您可以稍微不同的方式解决您的问题:

project_keys = sorted(project.proj_id
                      for project in projects.itervalues()
                      if not project.invalid)
Run Code Online (Sandbox Code Playgroud)

这会保留您感兴趣的项目,而不是删除您不感兴趣的项目.上面给出的示例使用生成器表达式而不是列表推导,但它可以使用.