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

Python lambda function to sort list according to dictionary

下面的示例代码检索所有正在运行的过程并打印它们。 他们是按照第三个例子 here and final one from 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)

在第一个示例中,lambda 函数采用一些变量 p 和 returns p.dict['name']。您可以将此处的 p 更改为 x 或您想要的任何内容:它只是一个占位符。

在第二个示例中,key=lambda ordem: procs_dic['name'], reverse=False)lambda 接受了一个叫做 ordem 的东西,然后一遍又一遍地只接受 returns procs_dic['name']

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

我的猜测是您希望第二个示例中的 sorted 代码行如下所示:

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

注意Process.name() returns进程名

您的第二个代码片段的 lambda 会在同一个字典中查找 'name',无论它传递的是什么对象;这怎么可能行得通?

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

您将第一个片段变成第二个片段的更改显然是出于您担心第一个

seems to mix the local p variable of the for statement with the p.dict dictionary

我很乐意提供帮助,但恐怕我不明白您看到的是什么问题。也许以下可能有帮助?这里有 两个 个变量,称为 p。第一个用于进程循环;每次循环它的值都是一个进程对象,我们给该进程对象一个 dict 属性,其中包含 'name' 的条目。第二个是匿名函数 (lambda) 的参数:它的值也始终是一个进程对象。如果你愿意,你可以给它们不同的名字,它不会破坏任何东西,但实际上我认为它更清楚:在这段代码中,p 是你所说的一个变量,它的值是一个过程目的。但是什么都没有 "mixed up".

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

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']))