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

标签 python sorting dictionary

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

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_locationserial_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'})]

关于python - 根据多个子字典值对字典字典进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11346111/

相关文章:

Java 多维数组排序

javascript - 使用 JavaScript 映射键/值

python - setup.py build 是做什么的?

xml - XSLT 按名称对节点进行排序?

python - 尝试使用 Python 请求向 OpenStreetMap Overpass API 发送 xml 文件

ruby-on-rails - ActiveRecord 对象数组上的 Ruby Array#sort_by 似乎很慢

python - 如何获取多个字典中具有最高值的每个键的字典名称

c# - 多线程访问C#字典

python - Python 中的 Gtk 错误

python:将多个参数从一个函数传递到另一个函数