502

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

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

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

4

9 に答える 9

762

keyでキーワードを使用してみてくださいsorted()

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], 
       key=lambda x: x[1])

keyは、データ構造から比較可能な要素を取得する方法を識別する関数である必要があります。あなたの場合、それはタプルの 2 番目の要素なので、にアクセスします[1]

itemgetter(1)最適化については、本質的に の高速バージョンである を使用した jamylak の応答を参照してくださいlambda x: x[1]

于 2012-05-22T02:51:36.023 に答える
225
>>> 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この場合、@cheekenによるソリューションよりもIMOの使用の方が読みやすいです。また、ほとんどすべての計算が を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
于 2012-05-22T02:51:24.010 に答える
50

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

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)],key=lambda x: x[1], reverse=True)
于 2015-03-29T17:50:13.270 に答える
44

Python初心者として、データが実際に次のようになった場合に言及したかっただけです。

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

sorted()最初の要素はすべて同一であるため、タプルの2番目の要素で自動的にソートされます。

于 2013-11-20T22:49:59.440 に答える
15

Pythonウィキから:

>>> 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)]
于 2012-05-22T02:54:10.873 に答える
8

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

def MyFn(a):
    return a[1]

それから:

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=MyFn)
于 2016-02-16T02:58:13.143 に答える
4

の場合Python 2.7+、これは機能し、受け入れられた回答が少し読みやすくなります。

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda (k, val): val)
于 2017-02-05T11:01:05.483 に答える
0

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')]
于 2017-06-01T15:15:15.507 に答える