次のようなタプルのリストがあります。
[('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
このリストをタプル内の整数値で昇順に並べ替えたいと思います。出来ますか?
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]
。
>>> 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
Cheekenの答えに追加すると、これはタプルのリストを2番目の項目で降順でソートする方法です。
sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)],key=lambda x: x[1], reverse=True)
Python初心者として、データが実際に次のようになった場合に言及したかっただけです。
data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
sorted()
最初の要素はすべて同一であるため、タプルの2番目の要素で自動的にソートされます。
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)]
ラムダ回避メソッドの場合、最初に独自の関数を定義します。
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')]