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
在顶部的块上使用列表理解?简明?看起来更好?
您的列表理解使用副作用.只是执行它应该更新project_keys以提供您想要的结果.
[project_keys.remove(project.proj_id)
for project in projects.itervalues()
if project.invalid]
Run Code Online (Sandbox Code Playgroud)
来自的返回值remove
是None
.将列表推导的结果分配给project_keys
您出错的地方.
一个简单的循环可能在这里更清楚.使用副作用的列表理解可能会令人困惑.
但是,您可以稍微不同的方式解决您的问题:
project_keys = sorted(project.proj_id
for project in projects.itervalues()
if not project.invalid)
Run Code Online (Sandbox Code Playgroud)
这会保留您感兴趣的项目,而不是删除您不感兴趣的项目.上面给出的示例使用生成器表达式而不是列表推导,但它可以使用.