【问题标题】:Python lambda function to sort list according to dictionaryPython lambda函数根据字典对列表进行排序
【发布时间】:2016-11-04 17:10:15
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    您将第一个 sn-p 变成第二个的更改显然是出于您对第一个 sn-p 的担忧

    似乎将 for 语句的局部 p 变量与 p.dict 字典混合在一起

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

    【讨论】:

    • 实际上,我按照@JordanMcQueen 的提示将倒数第二行更改为processes = sorted(procs, key=lambda ordem: ordem.dict['name'], reverse=False)。但是,我只能在try之后的行更改为proc.dict = proc.as_dict(['pid', 'name'])后才能完成任务。
    • 对。因此,在这样做之后,您将拥有与第一个 sn-p except 中完全相同的代码,您将一个名为 p 的变量重命名为 proc,另一个重命名为 ordem
    【解决方案2】:

    尝试使用字典将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']))
    

    【讨论】:

      【解决方案3】:

      在第一个示例中,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() 返回进程的名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-23
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 2014-03-13
        • 2019-03-04
        相关资源
        最近更新 更多