如何在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排序。