Pendant que je débogage une behavour illogique que je suis venu à la bizarrerie suivante dans Python 2.5 trié() appels de fonction:Python triée() fonction clé bizarreries
>>> 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]
deux premiers appels fonctionnent comme prévu, mais le le dernier est imho simplement mauvais! Ce devrait être: [1, 2, 0].
Après d'autres expériences pour essayer de venir à la racine du problème que je suis venu à cette (ne pas utiliser lambda ou opération de négation, mais il est par ailleurs le même problème):
>>> bb = [-10, -5, -20]
>>> sorted([0, 1, 2], key=bb.__getitem__)
[2, 0, 1]
Même les choses comme suit ne fonctionne pas et montre que la double négation fonctionne à nouveau:
>>> 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]
Est-ce que je perds la tête ou quel est le problème? Ou pourquoi Python 3.x n'a-t-il pas l'argument cmp qui fonctionnait bien (la compatibilité est la raison pour laquelle je ne l'utilise pas)?
Pourquoi le troisième résultat est-il faux? Les valeurs que vous triez sont '[0, 1, 2]', et les touches '[-10, -5, -20]'. Sorted qui se traduirait par '[-20, -10, -5]', ce qui donne '[2, 0, 1]' pour les valeurs ... – adw
Oups, tout va bien! Je ne sais pas pourquoi je pensais que cela devrait retourner quelque chose comme: >>> bb = [-1, -1, -1] >>> j = 0 >>> pour moi en trié (gamme (len (aa)), clé = lambda a: -aa [a]): ... bb [i] = j ... j + = 1 >>> bb [1, 2, 0] – gw0