给出以下dict

class Object:
    def __repr__(self): return "Object"

foo = {
    1: [(10, Object()), (10, Object())],
    2: [(11, Object()), (10, Object())]
}

sorted(foo.items(), key= lambda x : x[1][0], reverse=True)


使用排序功能,产生预期结果

[
    (2, [(11, Object), (10, Object)]),
    (1, [(10, Object), (10, Object)])
]


当第一项对于dict中的所有值相同时,就会出现问题。

foo2 = {
    1: [(10, Object()), (10, Object())],
    2: [(10, Object()), (10, Object())]
}


由于__lt__()未在Object中实现,因此sorted()引发TypeError异常:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'Object' and 'Object'


在这种情况下,排序不是必需的,但是无论如何我都需要使用算法。

我该怎么做才能避免此错误?

最佳答案

只需添加更多索引:

key=x[1][0][0]


演示:

>>> sorted(foo2.items(), key=lambda x: x[1][0][0], reverse=True)
[(1, [(10, Object), (10, Object)]), (2, [(10, Object), (10, Object)])]


按字典顺序比较元组,首先比较第一个元素,然后在第一个元素相等时比较第二个元素,依此类推。这是设计使然。

但是,如果您不希望在排序时使用整个元组,那么解决方案是不要传入整个元组。仅传递第一个元素,然后按输入顺序打破联系。对于3.6之前的Python版本的词典,这意味着未定义顺序(请参见Why is the order in dictionaries and sets arbitrary?)。

在我的演示中,我使用了Python 3.7,并且由于两种情况下第一个元组的第一个元素均为10,因此输出的顺序与键的定义顺序相同。 2之前的1。

关于python - sorted()自动按元组的第二个元素排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53538055/

10-09 20:40