2016-11-04 127 views
2

下面的示例代码检索所有runing procces并打印它们。 他们在第三个示例here之后写了一个蜜蜂,最后一个从here开始。问题是我无法弄清楚为什么只有第一个按照需要检索进程。Python lambda函数根据字典对列表进行排序

我认为它与lambda函数构造有关。但正确运行的样本,第一个似乎将for语句的当地p变量与p.dict字典混合在一起,这让我陷入了困境。

第一样品:

import psutil 

procs = [] 

for p in psutil.process_iter(): 
    try: 
     p.dict = p.as_dict(['pid', 'name']) 
    except psutil.NoSuchProcess: 
     pass 
    else: 
     procs.append(p) 

processes = sorted(procs, key=lambda p: p.dict['name'], reverse=False) 

print(processes) 

第二样品:

import psutil 

procs = [] 

for proc in psutil.process_iter(): 
    try: 
     procs_dic = proc.as_dict(['pid', 'name']) 
    except psutil.NoSuchProcess: 
     pass 
    else: 
     procs.append(proc) 

processes = sorted(procs, key=lambda ordem: procs_dic['name'], reverse=False) 

print(processes) 

回答

3

你的第二个代码片段的lambda在同一个字典中查找'name',不管它传递了什么对象;这怎么可能工作?

你的第三个似乎没有试图对流程进行排序;我不确定它与这个问题有什么关系。

你所做打开第一个片段到第二个变化显然是由您的关心激励第一

似乎与p.dict字典混合的局部变量p的声明

我很乐意帮忙,但恐怕我不明白你看到了什么问题。也许以下可能有所帮助?有两个变量在这里被称为p。第一个用于循环过程;每次循环它的值都是一个过程对象,并且我们给该过程对象一个dict属性,其中包含'name'的条目。第二个是你的匿名函数(lambda)的参数:它的值也总是一个过程对象。如果你愿意,你可以给它们不同的名称,但它不会破坏任何东西,但实际上我认为它更清晰:在这一小段代码中,p就是你所称的变量,它的值是一个过程对象。但没有什么会“混淆”。

+0

事实上,我改变倒数第二行到'过程=排序(特效,键=拉姆达ORDEM:ordem.dict [ '名称'],反向=假)',以下@JordanMcQueen小费。然而,我只能在'try'后改成'proc.dict = proc.as_dict(['pid','name'])'这一行后才能完成任务。 –

+0

对。因此,在完成之后,您的代码与第一个代码段中的代码完全相同*除了*,您已将名为'p'的变量之一重命名为'proc',另一个变为'ordem'。 –

1

在第一个样品中,lambda功能需要一些变种p并返回p.dict['name']。您可以将p更改为x或任何您想要的:它只是一个占位符。

在第二个示例中,key=lambda ordem: procs_dic['name'], reverse=False)lambda需要一个名为ordem的东西,然后一次又一次地返回procs_dic['name']

关键在sorted中工作的方式是这样的:因为它遍历元素并对它们进行排序,它会在每个元素上调用lambda以确定将其排序的值。

我的猜测是,要在第二个例子中sorted行代码如下所示:

processes = sorted(procs, key=lambda x: x.name(), reverse=False)

注意Process.name()返回进程的名称。

1

尝试使用字典映射Process es到包含其信息的字典。

proc_dict = {} 
for proc in psutil.process_iter(): 
    try: 
     proc_dict[proc] = proc.as_dict(['name', 'pid']) 
    except psutil.NoSuchProcess: 
     continue 

然后根据该过程字典的name值进行排序。

print(*sorted(proc_dict, lambda x: proc_dict[x]['name'])) 
相关问题