自定义排序Python字典

use*_*719 11 python

所以当我打印它时,我有一个字典看起来像这样:

{'10': -10, 'ZT21': 14, 'WX21': 12, '2': 15, '5': -3, 'UM': -25}
Run Code Online (Sandbox Code Playgroud)

我想以自定义方式对它们进行排序,我定义了这种方式.比方说,我希望它进行排序(按键)的方式是ZT21, 10, WX21, UM, 5, 2,ZT21, 10, WX21, UM, 5, 2,ZT21, 10, WX21, UM, 5, 2,ZT21, 10, WX21, UM, 5, 2,ZT21, 10, WX21, UM, 5, 2,ZT21, 10, WX21, UM, 5, 2.

任何人都知道如何以预定义/自定义方式整理字典?我正在做的是从数据库中获取这个字典,它可以提供超过20个密钥,所有密钥都有特定的顺序.始终设置顺序,但有时某些键/值不会出现在字典中.所以这也可能发生:

{'ZT21': 14, 'WX21': 12, '2': 15, '5': -3, 'UM': -25}
Run Code Online (Sandbox Code Playgroud)

排序(按键)为ZT21, 10, WX21, UM, 5, 2,ZT21, 10, WX21, UM, 5, 2,ZT21, 10, WX21, UM, 5, 2,ZT21, 10, WX21, UM, 5, 2,ZT21, 10, WX21, UM, 5, 2,ZT21, 10, WX21, UM, 5, 2.

所以10在这个例子中不存在,但我需要的排序仍然是相同的,10只是不存在.

有任何想法吗?

Joh*_*ooy 33

Python中的字典是无序的.您可以获得所需的结果list

>>> d = {'10': -10, 'ZT21': 14, 'WX21': 12, '2': 15, '5': -3, 'UM': -25}
>>> keyorder = ['ZT21', '10', 'WX21', 'UM', '5', '2']
>>> sorted(d.items(), key=lambda i:keyorder.index(i[0]))
[('ZT21', 14), ('10', -10), ('WX21', 12), ('UM', -25), ('5', -3), ('2', 15)]
Run Code Online (Sandbox Code Playgroud)

或者作为OrderedDict

>>> from collections import OrderedDict
>>> OrderedDict(sorted(d.items(), key=lambda i:keyorder.index(i[0])))
OrderedDict([('ZT21', 14), ('10', -10), ('WX21', 12), ('UM', -25), ('5', -3), ('2', 15)])
Run Code Online (Sandbox Code Playgroud)

如果你正在做很多这样的事情,那么使用一个dictkeyorder 会更有效率

>>> keyorder = {k:v for v,k in enumerate(['ZT21', '10', 'WX21', 'UM', '5', '2'])}
>>> OrderedDict(sorted(d.items(), key=lambda i:keyorder.get(i[0])))
OrderedDict([('ZT21', 14), ('10', -10), ('WX21', 12), ('UM', -25), ('5', -3), ('2', 15)])
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案!另外:如果你有嵌套字典 - 例如 `{"0":{"0":{"obj":"book", "rel":"gave", "subj":"Victoria"}}, "1 ":{"0":{"obj":"it","re​​l":"loved","subj":"She"}}}` -- 可以对最里面的键进行排序,`keyorder = ['subj ', 'rel', 'obj']` 如下: `for i in range(len(dict)): for j in range(len(dict[i])):sorted_dict =sorted(relations_dict[i][j ].items(), key=lambda item:keyorder.index(item[0]))` (2认同)