Python:按键的一部分对字典中的项进行排序?
假设我有一本国王字典,名字中的罗马数字作为键,整数形式的罗马数字作为值Python:按键的一部分对字典中的项进行排序?,python,sorting,dictionary,key,Python,Sorting,Dictionary,Key,假设我有一本国王字典,名字中的罗马数字作为键,整数形式的罗马数字作为值 d={'Zemco III':3,'Usamec XL':40,'Usamec VII':7,'Usamec VIII':8,'Usamec XLII':42,'Mary XXIV':24,'Robert III':3,'Robert XV':15,'Usamec XLIX':49} 我想把这个列表从大到小排序,也就是说Usamec XLII应该排在Usamec XLIX之前。我还想按字母顺序对列表进行排序,即Usamec
d={'Zemco III':3,'Usamec XL':40,'Usamec VII':7,'Usamec 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))
然而,因为罗马数字是键的一部分,所以我的字母排序并没有按照预期的那样工作。我的问题是,我可以按部分键对字典进行排序吗?例如,如果我的键是Zemco III,我可以用key.split()[0]而不是整个键对项目进行排序吗?谢谢
键
只是一个函数,用于接收项目并返回需要排序的内容。它可以是任何东西
这将按(名称不带最右边的单词、数字)
键对项目进行排序:
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)]
如果您使用python 3,请使用以下键
:
lambda item: (item[0].rsplit(None, 1)[0], item[1])
对于多单词名称,key.rsplit(None,1)[0]优于
key.split()[0]
。要对其进行排序,可以执行以下操作:
sorted_stuff = sorted([(ord(x[0]), x, y) for x, y in d.items()])
final_sorted = [(y,z) for x,y,z in sorted_stuff]
排序的内容将如下所示:
[(77, 'Mary XXIV', 24), (82, 'Robert III', 3)]
最终排序的将正确格式化:
[('Mary XXIV', 24), ('Robert III', 3)]
作为一个后续问题,如果我的字典是按顺序排列的,所以数字排在第一位,然后是名字,我又想按名字的第一部分排序,那会怎么样?按照相同的格式,我会得到:
sorted(d.items(),key=lambda(num,name):(num,name.rsplit(None,1)[0])
,但是如何合并类似key=operator.itemgetter(1)
的内容呢?谢谢如果按相同的键排序,则元组应相同:(name.rsplit(None,1)[0],num)
。只有lambda
参数的顺序改变<如果您仍然必须拆分名称,则代码>itemgetter将帮不上忙。你的倒排字典将如何处理重复的数字?