1

スクリーン名が示すように、私は Python を初めて使用します。タプルのリストをソートしようとしていて、リスト内の (x,y) ペアを考えていて、問題が発生しました。私の目標は、タプルのリストを x 変数で主に昇順でソートすることですが、次にソートします

HowToSort の wiki ( http://wiki.python.org/moin/HowTo/Sorting/ ) を調べて、オペレーターモジュールとitemgetter関数をキーとして試してみようと思いました。

単純な sorted() 関数でタプルをうまくソートできますが、1 つのインデックスを昇順で、もう 1 つを昇順で並べ替えたい場合、私は迷ってしまいます。コードは次のとおりです。

from operator import itemgetter, attrgetter

ItemList = [(1,7),(2,1),(1,5),(1,1)]
# Want list sorted with X values descending, then y values ascending
# expected [(2, 1), (1, 1), (1,5), (1, 7)]

print
print '  Input:', ItemList
print 'Output1:',sorted(ItemList, reverse = True)
print 

print '  Input:', ItemList
print 'Output2:', sorted(ItemList, key = itemgetter(-0,1))
print
print ' WANTED:', '[(2, 1), (1, 1), (1,5), (1, 7)]'

次の出力で:

  Input: [(1, 7), (2, 1), (1, 5), (1, 1)]
Output1: [(2, 1), (1, 7), (1, 5), (1, 1)]

  Input: [(1, 7), (2, 1), (1, 5), (1, 1)]
Output2: [(1, 1), (1, 5), (1, 7), (2, 1)]

 WANTED: [(2, 1), (1, 1), (1, 5), (1, 7)]

私は明らかに itemgetter 関数を理解していません。

また、(x,y) ペアで 2 つの並べ替えを行う方法についてのアイデアはありますか? 私はラムダソリューションを避けたいと思っていますが、それがどこに向かっていると確信しています。ありがとう。

4

1 に答える 1

2

-0同じです0itemgetter()さらに、負のインデックスは;とは異なる意味を持ちます。値が否定されるという意味ではありません。

lambda代わりにaを使用します。

sorted(ItemList, key=lambda item: (-item[0], item[1]))

デモ:

>>> ItemList = [(1,7),(2,1),(1,5),(1,1)]
>>> sorted(ItemList, key=lambda item: (-item[0], item[1]))
[(2, 1), (1, 1), (1, 5), (1, 7)]

負のインデックスは、シーケンスの最後から項目を取ります:

>>> end = itemgetter(-1)
>>> end([1, 2, 3])
3

itemgetter()、取得した項目を変更することはありません。もちろん、それを無効にすることもありません。

itemgetter()これは便利なメソッドに過ぎないことに注意してください。使用する必要はありませ。より複雑な並べ替え順序の場合は、カスタム関数またはラムダを使用することをお勧めします。

于 2013-08-16T18:45:50.687 に答える