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".
尝试使用字典映射 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']))
下面的示例代码检索所有正在运行的过程并打印它们。 他们是按照第三个例子 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".
尝试使用字典映射 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']))