タプルのリストを2番目の項目(整数値)でソートします
このようなタプルのリストがあります。
[('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
このリストをタプル内の整数値で昇順に並べ替えます。出来ますか?
sorted()
とkey
キーワードを使用してみてください。
sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda x: x[1])
key
は、データ構造から同等の要素を取得する方法を識別する関数です。あなたの場合、それはTupleの2番目の要素なので、[1]
にアクセスします。
最適化については、itemgetter(1)
を使用したjamylakの応答を参照してください。これは基本的にlambda x: x[1]
の高速版です。
>>> from operator import itemgetter
>>> data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
>>> sorted(data,key=itemgetter(1))
[('abc', 121), ('abc', 148), ('abc', 221), ('abc', 231)]
この場合、itemgetter
を使用したIMOは@cheekenによる解決策よりも読みやすくなります。 c
を使用するのではなく、ほとんどすべての計算がlambda
側(意図せずに)で行われるため、これも高速です。
>python -m timeit -s "from operator import itemgetter; data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]" "sorted(data,key=itemgetter(1))"
1000000 loops, best of 3: 1.22 usec per loop
>python -m timeit -s "data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]" "sorted(data,key=lambda x: x[1])"
1000000 loops, best of 3: 1.4 usec per loop
Pythonの初心者として、データが実際には次のようになっているとしたら
data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
最初の要素はすべて同じなので、sorted()
はTupleの2番目の要素で自動的にソートします。
チーケンの答えに加えて、これはタプルのリストを降順の2番目の項目でソートする方法です。
sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)],key=lambda x: x[1], reverse=True)
Python wikiから:
>>> from operator import itemgetter, attrgetter
>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
インプレースソートには、
foo = [(list of tuples)]
foo.sort(key=lambda x:x[0]) #To sort by first element of the Tuple
ラムダ回避メソッドの場合は、最初に独自の関数を定義します。
def MyFn(a):
return a[1]
その後:
sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=MyFn)
Python 2.7+
の場合、これはうまくいき、受け入れられた答えを少し読みやすくします。
sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda (k, val): val)
OPのソート値が整数であるという事実は、それ自体問題には関係ありません。つまり、ソート値がテキストの場合、受け入れられた答えは機能します。ソート中にソートを変更できることも指摘します(たとえば、大文字と小文字を区別するため)。
>>> sorted([(121, 'abc'), (231, 'def'), (148, 'ABC'), (221, 'DEF')], key=lambda x: x[1])
[(148, 'ABC'), (221, 'DEF'), (121, 'abc'), (231, 'def')]
>>> sorted([(121, 'abc'), (231, 'def'), (148, 'ABC'), (221, 'DEF')], key=lambda x: str.lower(x[1]))
[(121, 'abc'), (148, 'ABC'), (231, 'def'), (221, 'DEF')]