[英]Python lambda function to sort list according to dictionary
下面的示例代码检索所有运行过程并进行打印。 他们已经写蜂后的第三个例子在这里 ,也是最后一个从这里 。 问题是我无法弄清楚为什么只有第一个检索按需要排序的过程。
我认为这与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都在同一字典中查找'name'
,而不管它传递了什么对象。 那怎么可能工作呢?
您的第三个用户似乎甚至没有试图对流程进行排序; 我不确定与这个问题有什么关系。
您将第一个代码段转换为第二个代码段所做的更改显然是由于您担心第一个代码段
似乎将for语句的本地p变量与p.dict字典混合
很乐意为您提供帮助,但恐怕我不明白您看到的是什么问题。 也许以下可能有帮助? 这里有两个变量称为p
。 第一个用于循环过程;第二个用于循环过程。 每次循环时,它的值都是一个过程对象,我们为该过程对象指定一个dict
属性,该属性包含'name'
的条目。 第二个是匿名函数(lambda)的参数:其值也始终是一个过程对象。 您可以根据需要给它们取不同的名称,它不会破坏任何内容,但实际上我认为这很清楚:在这段代码中, p
称为变量,其值是一个过程对象。 但是没有什么变得“混乱”。
在第一个示例中, 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()返回进程的名称。
尝试使用将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']))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.