繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM