Python lambda函数根据字典对列表进行排序

时间:2016-11-04 17:10:15

标签: python windows python-3.x lambda psutil

示例代码检测所有运行过程并打印它们。 他们是在第三个例子here之后编写的,最后一个是here。问题是我无法弄清楚为什么只有第一个检索按需要排序的进程。

我认为它与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 个答案:

答案 0 :(得分:3)

你的第二个代码片段的lambda在同一个字典中查找'name',无论它通过什么对象;怎么可能有用?

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

您将第一个代码段转换为第二个代码段所做的更改显然是出于您对第一个代码的关注

  

似乎将for语句的本地p变量与p.dict字典

混合在一起
我很乐意提供帮助,但我担心我不明白你看到的问题。也许以下可能会有所帮助?这里有两个变量,称为p。第一个用于循环过程;每次循环循环时,它的值都是一个进程对象,我们为该进程对象提供一个包含dict条目的'name'属性。第二个是你的匿名函数(lambda)的参数:它的值也总是一个进程对象。你可以给他们不同的名字,如果你想要它并不会破坏任何东西,但实际上我认为它更清晰:在这一点代码中,p就是你所说的值为进程对象的变量。但是没有什么可以和#34;混合起来。

答案 1 :(得分:1)

在第一个示例中,lambda函数需要一些var 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()返回进程的名称。

答案 2 :(得分: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']))