2番目のパラメーターに基づいてタプルを並べ替える


93

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

("Person 1",10)
("Person 2",8)
("Person 3",12)
("Person 4",20)

私が作成したいのは、タプルの2番目の値で昇順でソートされたリストです。したがって、L [0]は("Person 2", 8)ソート後にする必要があります。

これどうやってするの?Python3.2.2の使用それが役立つ場合。


回答:


187

このkeyパラメーターを使用して、次のことができますlist.sort()

my_list.sort(key=lambda x: x[1])

または、少し速く、

my_list.sort(key=operator.itemgetter(1))

(他のモジュールと同様に、それimport operatorを使用できるようにする必要があります。)


3
L.sort(key=operator.itemgetter(1))コードで使用しようとしましたが、NameErrorが発生し、「演算子」が定義されていません。何か特別なものをインポートする必要がありますか?
user974703 2011

3
少し検索しましたがimport operator、関数を使用するにはを使用する必要があります。あなたがそれをあなたの答えに加えるならば、私はそれを受け入れたとマークします。
user974703 2011

timeit.timeit(デフォルトオプション)を使用したテストでは、次の2つのアプローチに大きな違いはありません。operator.itemgetter= 1.05µs、ラムダ= 1.25µs /反復
Noel Evans

my_list.sort(key = operator.itemgetter(1))ソリューションをありがとう!! :)
aman_novice 2016

1
lambdaキーワードを初めて使用する場合:stackoverflow.com/questions/13669252/what-is-key-lambda
EchoLynx 2017年

12

また、Python 3.Xを使用している場合はsortedmylistの関数を適用できます これは、@ SvenMarnachが上記で示した回答への単なる追加です。

# using *sort method*
mylist.sort(lambda x: x[1]) 

# using *sorted function*
sorted(mylist, key = lambda x: x[1]) 

これは、新しいリストを返す組み込みの機能です。新しいリストが必要な場合は、のsorted代わりに使用することは明らかであるため、あなたの答えはすでにここにあるものには何の貢献もしませんlist.sort
miradulo 2018

2
@SamuelNde式がソートに対して同じように機能するかどうかわからなかったので、ここを下にスクロールしました。
赤ずきん

ええ、同意しました、これも私を助けました
StackG

-1
    def findMaxSales(listoftuples):
        newlist = []
        tuple = ()
        for item in listoftuples:
             movie = item[0]
             value = (item[1])
             tuple = value, movie

             newlist += [tuple]
             newlist.sort()
             highest = newlist[-1]
             result = highest[1]
       return result

             movieList = [("Finding Dory", 486), ("Captain America: Civil                      

             War", 408), ("Deadpool", 363), ("Zootopia", 341), ("Rogue One", 529), ("The  Secret Life of Pets", 368), ("Batman v Superman", 330), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)]
             print(findMaxSales(movieList))

出力->ローグワン


いくつかの考え:これは実際には質問に答えません(タプルの値でソートされたリストを取得する方法)。タプルをループ内で直接解凍できます(ムービーの場合、listoftuplesの値:); タイプ「タプル」をオーバーライドしました。そして、それは実際には単一のリスト内包している行うことができます(リターン)は、映画のために(値、映画)(listoftuplesの値をソートし、[ - 1] [1])
RFox

私はあなたが何をしようとしているかに感謝します、しかし私はそれが優雅さを欠いていてそして改善されることができると主張します。一般に、このようなタプルの要素の順序を変換することは不適切な方法と見なされます。リストの理解とタプルの開梱についてのポイントはまだ残っていると思います。そして、私は、受け入れられた答えよりもこの方法論を使用する人を思いとどまらせます。
RFox 2017

私は能力がなく、あなたが投稿したコードを機能させることができませんでした。おそらくユーザーエラーです
Darrell White

しかし、それを少し変更すると、間違いなくあなたの答えは200倍良くなります。
ダレルホワイト

def findMaxSales(listoftuples):newlist = sorted((value、movies)for movies、value in listoftuples)return newlist [-1] [1] movieList = [( "Finding Dory"、486)、( "Captain America:Civil War "、408)、(" Deadpool "、363)、(" Zootopia "、341)、(" Rogue One "、529)、(" The Secret Life of Pets "、368)、(" Batman v Superman "、330 )、( "Sing"、268)、( "Suicide Squad"、325)、( "The Jungle Book"、364)] print(findMaxSales(movieList))
ダレルホワイト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.