如何在python中对字典列表进行排序?

如何在python中对字典列表进行排序?,python,sorting,dictionary,Python,Sorting,Dictionary,输入数据: results= [ { "timestamp_datetime": "2014-03-31 18:10:00 UTC", "job_id": 5, "processor_utilization_percentage": 72 }, { "timestamp_datetime": "2014-03-31 18:20:00 UTC", "job_id": 2, "proces

输入数据:

results= [
        {
      "timestamp_datetime": "2014-03-31 18:10:00 UTC",
      "job_id": 5,
      "processor_utilization_percentage": 72
    },
        {
      "timestamp_datetime": "2014-03-31 18:20:00 UTC",
      "job_id": 2,
      "processor_utilization_percentage": 60
    },
        {
      "timestamp_datetime": "2014-03-30 18:20:00 UTC",
      "job_id": 2,
      "processor_utilization_percentage": 0
    }]
输出必须按如下顺序排序,按作业id升序分组:

newresult = {
    '2':[{ "timestamp_datetime": "2014-03-31 18:20:00 UTC",
            "processor_utilization_percentage": 60},

          {"timestamp_datetime": "2014-03-30 18:20:00 UTC",
          "processor_utilization_percentage": 0},]

    '5':[{
          "timestamp_datetime": "2014-03-31 18:10:00 UTC",
          "processor_utilization_percentage": 72},
        ],
    }
什么是蟒蛇式的方法来做这件事?

你正在分组;这是一个最简单的方法:

newresult是一个字典,这些字典没有顺序;如果需要按升序访问作业ID,请按列出的键排序:

for job_id in sorted(newresult):
    # loops over the job ids in ascending order.
    for job in newresult[job_id]:
        # entries per job id
你正在分组;这是一个最简单的方法:

newresult是一个字典,这些字典没有顺序;如果需要按升序访问作业ID,请按列出的键排序:

for job_id in sorted(newresult):
    # loops over the job ids in ascending order.
    for job in newresult[job_id]:
        # entries per job id
您可以使用按其作业id对结果进行分组:

结果是一本字典,即它没有特定的顺序。如果要按升序迭代值,可以执行以下操作:

for key in sorted(new_results):
    entries = new_results[key]
    # do something with entries
更新:正如Martijn指出的,这要求结果列表按照作业id进行排序,就像在您的示例中一样,否则条目可能会丢失。

您可以使用按作业id对结果进行分组:

结果是一本字典,即它没有特定的顺序。如果要按升序迭代值,可以执行以下操作:

for key in sorted(new_results):
    entries = new_results[key]
    # do something with entries

更新:正如Martijn指出的,这要求结果列表按照作业id进行排序,就像在您的示例中一样,否则条目可能会丢失。

假设您确实不想在新结果中使用作业id:

from collections import defaultdict
newresult = defaultdict(list)
for result in results:
    job_id = result['job_id']
    newresult[job_id].append( 
        {'timestamp_datetime':result['timestamp_datetime'],
         'processor_utilization_percentage':result['processor_utilization_percentage']}
        )
#print newresult

我真的看不到一种通过字典理解来做到这一点的方法,但我相信有人在做这类事情方面有更多的经验,他可以做到这一点。不过,这很简单。

假设您真的不想在新结果中使用作业id:

from collections import defaultdict
newresult = defaultdict(list)
for result in results:
    job_id = result['job_id']
    newresult[job_id].append( 
        {'timestamp_datetime':result['timestamp_datetime'],
         'processor_utilization_percentage':result['processor_utilization_percentage']}
        )
#print newresult

我真的看不到一种通过字典理解来做到这一点的方法,但我相信有人在做这类事情方面有更多的经验,他可以做到这一点。不过,这非常简单。

您正在对输出进行分组;您还需要对组进行排序吗?您的时间表都是一样的,您是否完全按照处理器利用率百分比进行排序?输出不应该是列表字典,其中键应该是作业id才可以。字典没有顺序,您只能按作业id对数据进行分组。newresult中的键不按任何顺序列出。您正在对输出进行分组;您还需要对组进行排序吗?您的时间表都是一样的,您是否完全按照处理器利用率百分比进行排序?没有输出应该是列表的字典,其中键应该是job\u id only字典没有顺序,您只能按作业id对数据进行分组。newresult中的键不会按任何顺序列出。这仅在列表首先按作业id排序时有效。我的意思是,输入结果需要按作业id排序,groupby才能工作。结果是一个字典列表,如果索引0处有一个“job_id”:1的字典,索引5处有另一个字典,而其他条目之间有不同的“job_id”值,则输出中只有一个“jobid”:1个条目。根据groupby文档:通常情况下,iterable需要在同一个键函数上进行排序。使用defaultdict分组是一个ON操作,使用排序和groupby是ONlogN。当然,如果输入已经排序,groupby就很棒了。@MartijnPieters不知道这一点,谢谢你指出。我将把它添加到我的答案中,并将其保留在这里,这样其他人就不会犯同样的错误。这只有在列表首先按作业id排序时才有效。我的意思是,输入结果需要按作业id排序,groupby才能工作。结果是一个字典列表,如果索引0处有一个“job_id”:1的字典,索引5处有另一个字典,而其他条目之间有不同的“job_id”值,则输出中只有一个“jobid”:1个条目。根据groupby文档:通常情况下,iterable需要在同一个键函数上进行排序。使用defaultdict分组是一个ON操作,使用排序和groupby是ONlogN。当然,如果输入已经排序,groupby就很棒了。@MartijnPieters不知道这一点,谢谢你指出。我将把它添加到我的答案中,并将其保留在这里,这样其他人就不会犯同样的错误。OP进行了编辑,将输出按作业id按升序分组,因此,您需要在末尾添加一个排序。@BioGeek:除了字典没有排序之外。谢谢@MartijnPieters尝试您的解决方案获取下面的错误,请不要我正在使用python 3.0回溯最近的调用last:File,第1行,在newresult=defaultdictlist类型错误中:第一个参数必须为callable@sagar:您为列表分配了其他内容;首先使用del list,以便list再次引用内置类型。@sagar:在代码中不要将list用作变量。OP进行了编辑,使输出按作业id升序分组,因此,您需要在末尾添加一个排序。@BioGeek:除了字典没有排序之外。谢谢@MartijnPieters尝试了您的解决方案获得以下错误,请不要我正在使用python 3.0回溯最近的调用last:File,li
ne 1,在newresult=defaultdictlist类型错误中:第一个参数必须为callable@sagar:您为列表分配了其他内容;首先使用del list,以便list再次引用内置类型。@sagar:不要在代码中使用list作为变量。您可以使用list CONTRUSION和itertools.groupby来执行此操作,但需要先对结果进行排序;不值得,除非该列表始终已按作业id排序。您可以使用列表理解和itertools.groupby进行排序,但需要先对结果排序;不值得,除非该列表始终已按作业id排序。