1. ホーム
  2. python

[解決済み] カスタム比較関数でリストをソートする

2022-09-13 14:53:47

質問

このような名前の質問がいくつかあることは知っていますが、私の場合はうまくいかないようです。

私はリストのリストを持っています、50回5つの要素。私は各要素にカスタム比較関数を適用することによって、このリストを並べ替えたいと思います。この関数は、要素がソートされるリストの適合度を計算します。私は2つの関数、compareとfitnessを作成しました。

def compare(item1, item2):
    return (fitness(item1) < fitness(item2))

def fitness(item):
    return item[0]+item[1]+item[2]+item[3]+item[4]

で呼んでみたところ

sorted(mylist, cmp=compare)

または

sorted(mylist, key=fitness)

または

sorted(mylist, cmp=compare, key=fitness)

または

sorted(mylist, cmp=lambda x,y: compare(x,y))

また、同じパラメータでlist.sort()も試してみました。しかし、いずれにせよ、この関数はリストを引数として受け取るのではなく None . 私はそれがなぜなのか全くわかりません、ほとんどC++から来て、これは私にとってコールバック関数のすべてのアイデアと矛盾しています。どのように私はカスタム関数でこのリストを並べ替えることができますか?

編集 間違いを発見しました。元のリストを作成する連鎖の中で、1つの関数は何も返しませんでしたが、戻り値は使用されました。ご迷惑をおかけして申し訳ありません。

どのように解決するのですか?

>>> l = [list(range(i, i+4)) for i in range(10,1,-1)]
>>> l
[[10, 11, 12, 13], [9, 10, 11, 12], [8, 9, 10, 11], [7, 8, 9, 10], [6, 7, 8, 9], [5, 6, 7, 8], [4, 5, 6, 7], [3, 4, 5, 6], [2, 3, 4, 5]]
>>> sorted(l, key=sum)
[[2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7], [5, 6, 7, 8], [6, 7, 8, 9], [7, 8, 9, 10], [8, 9, 10, 11], [9, 10, 11, 12], [10, 11, 12, 13]]

上記は動作します。何か違うことをしているのでしょうか?

あなたのキー関数が単に sum であることに注意してください。