Python 首先按键对字典排序,然后按值对字典排序

Python 首先按键对字典排序,然后按值对字典排序,python,sorting,dictionary,Python,Sorting,Dictionary,我想对可能以int或tuple作为键的字典进行双重排序 d = {33:1, 44:1, (0,5):1 12:2, (1,2):2} 我想让它先按值排序,然后按键排序(如果可能的话,不是一个是tuple,第二个是int) 有人能帮我吗 提前谢谢这个怎么样 >>> d = {33:1, 44:1, (0,5):1, 12:2, (1,2):2} >>> helper_dict = {} >>> for k,v in d.items():

我想对可能以int或tuple作为键的字典进行双重排序

d = {33:1, 44:1, (0,5):1  12:2, (1,2):2}
我想让它先按值排序,然后按键排序(如果可能的话,不是一个是tuple,第二个是int)

有人能帮我吗

提前谢谢

这个怎么样

>>> d = {33:1, 44:1, (0,5):1, 12:2, (1,2):2}
>>> helper_dict = {}
>>> for k,v in d.items():
        helper_dict.setdefault(v,[]).append(k)    

>>> sorted_items = [(k,i) for k in sorted(helper_dict.keys()) for i in sorted(helper_dict[k]) ]
>>> sorted_items
[(1, 33), (1, 44), (1, (0, 5)), (2, 12), (2, (1, 2))]
或者只是

sorted(d.items(), key=lambda v: v[::-1])
编辑: 因为OP需要将结果作为字典

OrderedDict(sorted(d.items(), key=lambda v: v[::-1]))

首先,你应该注意,你可以而不是对字典进行排序。您可能会得到一个键/值已排序的列表,但字典本身永远不会。您可以在pydocs中找到

最好将字典视为一组无序的键:值 成对的

然后,您可能希望获得已排序的键列表:

# the .keys() returns a list with all the keys, and sorted() sorts them
#sorted_keys = sorted(d.keys()) this does not work since int's and tuples aren't of the same tipe
您可以尝试以下方法:

d_tuples = []
d_int = []
sorted_keys = []
for key in d.keys():
    # type() checks the variable type
    if type(key) == int:
        d_int.append(key)
    elif type(key) == tuple:
        d_tuples.append(key)
sorted_keys = d_tuples + sorted(d_int)
或已排序的值列表:

sorted_values = sorted(d.values())

从这里开始。使用lambda进行排序也比执行复杂循环更有效:)。多维排序可能有点困难,但只要测试一下就可以了,不应该那么困难。也许这个可以帮助:>甚至这个:>重复:除非您使用OrderedDict,否则无法保证排序字典的顺序字典本质上是未排序的。一旦修改条目,OrderedDicts也将被取消排序。除非将其设置为具有不可变值的冻结OrderedICT,否则不应返回OrderedICT。如果您需要某个内容的排序视图,请返回元组、列表或生成器,而不是字典。创建此OrderedDict也是浪费时钟周期,因为您关心的唯一方法是
\uuu iter\uuu
,它是从sorted()@IceArdor的输出中获得的,因为OrderedDict是按项目添加到字典的顺序排序的,他们对OP没问题。@volcano我没有把OP的问题解释为需要结果作为一个命令。在获取键的值时,排序顺序并不重要。我坚持我先前的发言。使用重新定义的
\uuuuu iter\uuuuu
创建您自己的字典类,或者创建一个元组/列表/生成器的新对象,以迭代已排序的键。@iCardor,在迭代键时顺序可能很重要。元组可能很麻烦-链式索引有可能使代码混乱,无法阅读。还有,为什么要重新发明自行车,而自行车又可以使用?顺便说一句,它在标准Python库中的事实表明,它背后有一个有效的用例?完全反吻
sorted_values = sorted(d.values())