2016-11-04 169 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'])) 
相關問題