给出以下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/