通过定义排序顺序,根据子字典键对python字典键进行排序

fat*_*dur 6 python sorting dictionary

我的问题是另一个问题的扩展,其中OP有一个字典,下面的字典,并希望根据子字典键对主键进行排序

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'}
}
Run Code Online (Sandbox Code Playgroud)

建议的(下面引用的)解决方案非常有效.

dicts = myDict.items()
dicts.sort(key=lambda (k,d): (d['site_location'], d['serial_num'],))
Run Code Online (Sandbox Code Playgroud)

但是,此解决方案按所有顺序按升序排序(按降序排序很简单).我想知道是否可以定义排序顺序的混合,比如serial_num升序但是site_location按降序排列?

jpp*_*jpp 3

这是一种解决方案,之所以可行,是因为列表排序是稳定的。我稍微更改了数据以证明它有效。

Python 文档中也规定了该方法。

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

result = sorted(myDict.items(), key=lambda x: x[1]['site_location'], reverse=True)
result = sorted(result, key=lambda x: x[1]['serial_num'])

# [('ABC12345', {'serial_num': 'ABC12345', 'site_location': 'South America'}),
#  ('ABC12346', {'serial_num': 'ABC12345', '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'})]
Run Code Online (Sandbox Code Playgroud)