Пока я отлаживал какое-то нелогичное поведение, я столкнулся со следующей странностью в Python 2.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]
Первые два вызова работают, как и ожидалось, но последний imho просто неправильно ! Должно быть: [1, 2, 0].
После дальнейших экспериментов по попытке найти корень проблемы я пришел к этому (не использует лямбду или операцию отрицания, но в остальном это та же проблема):
>>> 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]
Я схожу с ума или в чем проблема? Или почему Python 3.x не имеет аргумента cmp , который работал нормально (совместимость - причина, по которой я его не использую)?