Pythonでラムダを使用して並べ替える方法


178

Pythonでは、ラムダを使用して日付で並べ替えようとしています。エラーメッセージを理解できません。メッセージは次のとおりです。

<lambda>() takes exactly 1 argument (2 given)

私が持っているラインは

a = sorted(a, lambda x: x.modified, reverse=True)

8
keywoard引数を追加key = lambda x:x.modifiedが問題を解決します
shahjapan

回答:


325

使用する

a = sorted(a, key=lambda x: x.modified, reverse=True)
#             ^^^^

Python 2.xでは、sorted関数は次の順序で引数を取ります。

sorted(iterable, cmp=None, key=None, reverse=False)

したがって、がないkey=場合、渡したcmp関数は2つの引数をとる関数と見なされます。


13
この経験からキーワードパラメータの受け渡しを理解する良い機会があります。
Tony Veijalainen、2010

1
これは非常に古いですが、エラーコードが誤解を招く理由が何かわかりますか?関数が2をとるlambdaので、可能なPythonが別のパラメーターを提供しているようにあなたの答えは聞こえcmpますか?
SuperBiasedMan

@SuperBiasedManエラーは誤解を招くものではありません。cmp、コンパレーター関数は2つの引数を取ります。を渡すことを指定しない場合key、関数パラメーターの順序から、コンパレータを渡すと見なされます。あなたのラムダは1つのパラメータを取るので、有効なコンパレータではありません、そしてそれはエラーが言うことです。
Jezor

18
lst = [('candy','30','100'), ('apple','10','200'), ('baby','20','300')]
lst.sort(key=lambda x:x[1])
print(lst)

次のように印刷されます。

[('apple', '10', '200'), ('baby', '20', '300'), ('candy', '30', '100')]

これは文字列整数では機能しません。これをチェック!lst = [( '999'、 '9')、( '303'、 '30')、( '343'、 '34')] lst.sort(key = lambda x:x [1])print(lst )
ダニエルクア

結果は[( '303'、 '30')、( '343'、 '34')、( '999'、 '9')]で、すべてのリストの2番目の要素に基づいてソートされていません。
ダニエルクア

lst = [( 'candy'、 '999'、 '9')、( 'apple'、 '303'、 '30')、( 'baby'、 '343'、 '34')] lst.sort(key = lambda x:x [2])print(lst)
Daniel Kua

[( 'apple'、 '303'、 '30')、( 'baby'、 '343'、 '34')、( 'candy'、 '999'、 '9')]。2要素にも基づいてソートされていません!
ダニエルクア

7

Pythonリストには、データをソートするための2つの組み込みの方法があります。

sort()  A method that modifies the list in-place
sorted()  A built-in function that builds a new sorted list from an iterable

要件に基づいて、次の2つから選択できます。

元のリストを保持したい場合は、並べ替え機能を使用できます。元のリストが不要な場合は、並べ替え機能を使用できます。

ソートまたはソートする前に、ラムダを理解する必要があります。

ラムダは無名関数であり、無名関数は名前なしで定義された関数です。この投稿はそれをかなりうまく説明しているようです。

https://www.programiz.com/python-programming/anonymous-function

ラムダ関数は、評価されて返される式が1つしかないため、インラインでの呼び出しに適しています。ラムダの構文は次のとおりです。

ラムダ引数:式

ソートされた関数の使い方を見てみましょう:

student_tuples = [('john', 'A', 15),('jane', 'B', 12),('dave', 'B', 10),]
sorted(student_tuples, key=lambda student: student[2]) 

出力:[( 'dave'、 'B'、10)、( 'jane'、 'B'、12)、( 'john'、 'A'、15)]

ここで、tuplesを持つstudent_tuplesのリストが、student [2]であるキーパラメータに基づいてソートされていることがわかります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.