Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:按键的一部分对字典中的项进行排序?_Python_Sorting_Dictionary_Key - Fatal编程技术网

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将帮不上忙。你的倒排字典将如何处理重复的数字?