web-dev-qa-db-ja.com

タプルのリストを2番目の項目(整数値)でソートします

このようなタプルのリストがあります。

[('abc', 121),('abc', 231),('abc', 148), ('abc',221)]

このリストをタプル内の整数値で昇順に並べ替えます。出来ますか?

345
Amyth

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]の高速版です。

531
cheeken
>>> 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
184
jamylak

Pythonの初心者として、データが実際には次のようになっているとしたら

data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]

最初の要素はすべて同じなので、sorted()はTupleの2番目の要素で自動的にソートします。

39
Angus

チーケンの答えに加えて、これはタプルのリストを降順の2番目の項目でソートする方法です。

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)],key=lambda x: x[1], reverse=True)
38
Vignesh Jayavel

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)]
14

インプレースソートには、

foo = [(list of tuples)]
foo.sort(key=lambda x:x[0]) #To sort by first element of the Tuple
9

ラムダ回避メソッドの場合は、最初に独自の関数を定義します。

def MyFn(a):
    return a[1]

その後:

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=MyFn)
8
paulm

Python 2.7+の場合、これはうまくいき、受け入れられた答えを少し読みやすくします。

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda (k, val): val)
3
Neil

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')]
0
DaveL17