6 python sorting dictionary key
假设我有一个国王字典,其名称中包含罗马数字作为键,罗马数字以整数形式表示为值.
d = {'Zemco III': 3, 'Usamec XL': 40, 'Usamec VII': 7, 'Robert VIII': 8, 'Usamec XLII': 42, 'Mary XXIV': 24, 'Robert III': 3, 'Robert XV': 15, 'Usamec XLIX': 49}
我想从最古老到最年轻的列表排序,那就是Usamec XLII应该出现在Usamec XLIX之前.我还想按字母顺序对列表进行排序,即Usamec XLII应该出现在Zemco III之前.
我的方法是首先按名称排序,然后按罗马数字值排序:
x = sorted(d.items(),key=operator.itemgetter(0))
y = sorted(x,key=operator.itemgetter(1))
Run Code Online (Sandbox Code Playgroud)
但是,因为罗马数字是键的一部分,我的字母排序不能按预期工作.我的问题是,我可以通过密钥的一部分对字典进行排序,例如,如果我的密钥是Zemco III,我可以使用key.split()[0]而不是整个密钥以某种方式对我的项目进行排序吗?谢谢!
key只是一个接收项目并返回您需要排序的项目的函数。它可以是任何东西。
这按键对项目进行排序(name_without_rightmost_word, number):
In [92]: sorted(d.items(), key=lambda (name, num): (name.rsplit(None, 1)[0], num))
Out[92]:
[('Mary XXIV', 24),
('Robert III', 3),
('Robert VIII', 8),
('Robert XV', 15),
('Usamec VII', 7),
('Usamec XL', 40),
('Usamec XLII', 42),
('Usamec XLIX', 49),
('Zemco III', 3)]
Run Code Online (Sandbox Code Playgroud)
如果您使用 python 3,请使用以下命令key:
lambda item: (item[0].rsplit(None, 1)[0], item[1])
Run Code Online (Sandbox Code Playgroud)
key.rsplit(None, 1)[0]key.split()[0]比多单词名称的情况要好。