当我调试一些不合逻辑的行为时,在Python2.5 sorted()函数调用中出现了以下奇怪情况:
>>> aa = [10, 5, 20]
>>> sorted(range(len(aa)))
[0, 1, 2]
sorted(range(len(aa)), key=lambda a: aa[a])
[1, 0, 2]
sorted(range(len(aa)), key=lambda a: -aa[a])
[2, 0, 1]
!。
After further experiments for trying to come to the root of the problem I came to this (does not use lambda or negation operation, but it is otherwise the same problem):
>>> bb = [-10, -5, -20]
>>> sorted([0, 1, 2], key=bb.__getitem__)
[2, 0, 1]
即使像下面这样的事情也不起作用,表明双重否定又起作用了:
>>> bb = [-10, -5, -20]
>>> def fun(i):
... return bb[i]
>>> sorted([0, 1, 2], key=fun)
[2, 0, 1]
>>> def fun2(i):
... return -bb[i]
>>> sorted([0, 1, 2], key=fun2)
[1, 0, 2]
我是疯了还是哪里出了问题??
最佳答案
。
So when you say
sorted(range(len(aa)), key=lambda a: -aa[a])
您正在对
range(len(aa)
进行排序,即[0, 1, 2]
,但使用值-aa[0], -aa[1], -aa[2]
作为代理值。range(len(aa)) 0 1 2 <-- values
aa[a] 10 5 20
-aa[a] -10 -5 -20 <-- proxy values
Since -20, or
-aa[2]
, is the smallest proxy value, its associated value 2成为排序结果中的第一个元素。
由于-10或
-aa[0]
是下一个最小值,其关联值0将成为排序结果中的第二个元素。。
。
Python给出的答案是正确的。
关于python - Python sorted()键函数怪异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4115636/