Skip to main content
 首页 » 编程设计

python之根据多个子字典值对字典字典进行排序

2025年05月04日18exmyth

我有一本看起来像这样的字典:

myDict = { 
    'SER12346': {'serial_num': 'SER12346', 'site_location': 'North America'}, 
    'ABC12345': {'serial_num': 'ABC12345', 'site_location': 'South America'}, 
    'SER12345': {'serial_num': 'SER12345', 'site_location': 'North America'}, 
    'SER12347': {'serial_num': 'SER12347', 'site_location': 'South America'}, 
    'ABC12346': {'serial_num': 'ABC12346', 'site_location': 'Europe'} 
} 

我的目标是根据每个子词典的 site_location 和 serial_num 对这本词典进行排序。

使用我在这个问题中找到的代码 - Sort a dictionary of dictionaries python - 我能够对其进行排序,但这并不完全是我所期望的。

这是我的代码:

import pprint 
items = ((k, k2, v) for k in myDict for k2, v in myDict[k].items()) 
ordered = sorted(items, key=lambda x:x[-1], reverse=False) 
pprint.pprint(ordered) 

这是我得到的结果:

[('ABC12346', 'site_location', 'Europe'), 
 ('SER12345', 'site_location', 'North America'), 
 ('SER12346', 'site_location', 'North America'), 
 ('SER12347', 'site_location', 'South America'), 
 ('ABC12345', 'site_location', 'South America'), 
 ('ABC12346', 'serial_num': 'ABC12346'), 
 ('SER12345', 'serial_num': 'SER12345'), 
 ('SER12346', 'serial_num': 'SER12346'), 
 ('SER12347', 'serial_num': 'SER12347'), 
 ('ABC12345', 'serial_num': 'ABC12345')] 

虽然我期待更像这样的东西:

{ 
    'ABC12346': {'serial_num': 'ABC12346', 'site_location': 'Europe'} 
    'SER12345': {'serial_num': 'SER12345', 'site_location': 'North America'}, 
    'SER12346': {'serial_num': 'SER12346', 'site_location': 'North America'}, 
    'SER12347': {'serial_num': 'SER12347', 'site_location': 'South America'}, 
    'ABC12345': {'serial_num': 'ABC12345', 'site_location': 'South America'}, 
} 

实际结果是将序列号和站点位置分开。我想将它们放在排序的对象中。我该怎么做?

请您参考如下方法:

这是你想要的吗?

dicts = [{k: v} for (k,v) in myDict.items()] 
dicts.sort(key=lambda d: (d.values()[0]['site_location'], d.values()[0]['serial_num'],)) 

执行的输出:

import pprint 
pprint.pprint(dicts) 

是:

[{'ABC12346': {'serial_num': 'ABC12346', 'site_location': 'Europe'}}, 
 {'SER12345': {'serial_num': 'SER12345', 'site_location': 'North America'}}, 
 {'SER12346': {'serial_num': 'SER12346', 'site_location': 'North America'}}, 
 {'ABC12345': {'serial_num': 'ABC12345', 'site_location': 'South America'}}, 
 {'SER12347': {'serial_num': 'SER12347', 'site_location': 'South America'}}] 

编辑:我正在回答您对输出格式的回答,但这可能更有意义:

dicts = myDict.items() 
dicts.sort(key=lambda (k,d): (d['site_location'], d['serial_num'],)) 

输出:

[('ABC12346', {'serial_num': 'ABC12346', 'site_location': 'Europe'}), 
 ('SER12345', {'serial_num': 'SER12345', 'site_location': 'North America'}), 
 ('SER12346', {'serial_num': 'SER12346', 'site_location': 'North America'}), 
 ('ABC12345', {'serial_num': 'ABC12345', 'site_location': 'South America'}), 
 ('SER12347', {'serial_num': 'SER12347', 'site_location': 'South America'})]