针对更复杂循环的Python列表理解

针对更复杂循环的Python列表理解,python,python-3.x,list,list-comprehension,psutil,Python,Python 3.x,List,List Comprehension,Psutil,我对简单循环使用列表理解。但是我不能对下面的代码使用列表理解。我怎么做 import psutil list1 = [] for pr in psutil.process_iter(): with pr.oneshot(): list1.append([pr.name(), pr.status()]) Python 3.8 我不建议这样做,但从技术上讲,您可以使用以下代码将for循环转换为列表: from contextlib import ExitStack wi

我对简单循环使用列表理解。但是我不能对下面的代码使用列表理解。我怎么做

import psutil
list1 = []
for pr in psutil.process_iter():
    with pr.oneshot():
        list1.append([pr.name(), pr.status()])

Python 3.8

我不建议这样做,但从技术上讲,您可以使用以下代码将for循环转换为列表:

from contextlib import ExitStack

with ExitStack() as stack:
    list1 = [
        (tmp := [pr.name(), pr.status()]) and stack.close() or tmp
        for pr in psutil.process_iter()
        for pr in [stack.enter_context(pr.oneshot()), pr][1:]
    ]
del tmp

你不必总是使用列表理解。有时候最好不要这样做。如果这样做有效,不要急于改变,请阅读。有些构造,如
with
try
,不能通过列表理解进行复制。不要使用
list
作为变量名,它是Python内置的。我已经更新了第一篇文章。它是实际代码的简化版本。它有一些错误。你需要做一个函数,做一些不能用宏观理解的东西,比如说,或者试着去做。有没有办法提高性能(降低cpu使用率)?我在循环中使用此代码(重复不到一秒钟)。也可以接受非常小的改进(少于%1的使用收益)。答案可能与您的方法相似,也可能与您的方法不同(不使用列表理解)。@odunc90添加此答案是出于教育目的,以显示将
for
循环的简单结构复制为列表理解是多么复杂。我没有对代码进行基准测试,但我希望理解速度会慢一些,因为它必须创建一些临时对象和名称绑定。因此,您确实应该使用问题中的原始代码,它也更具可读性。