2017-08-07 7 views
1

文字列の連結を比較することによって文字列の配列をソートしようとしているので、配列内のすべての文字列を連結すると、 。しかし、私はソート機能でエラーを取得しておく:ValueErrorを:ValueError:ラムダ関数の解凍には2つ以上の値が必要

nums = ['3', '30', '34', '5', '9'] 
nums.sort(key = lambda (x,y): cmp(x+y,y+x)) 
# should get me ['9', '5', '34', '3', '30'] 
# instead, gets me the exception ValueError: need more than 1 value to unpack 

を解凍する必要以上の1価なぜこの出来事はありますか?ソート機能でこのような値を比較することはできませんか?問題は、https://leetcode.com/problems/largest-number/

+0

キー機能は値そのものを取ります。比較のために2つの値をとる 'cmp'関数とは異なります。あなたのケースでは十分ではありませんが、 'key'は最近のほうがずっと簡単です。 [sorted](https://docs.python.org/2/library/functions.html#sorted)のドキュメントを参照してください。ドキュメントの状態は 'list.sort'と同じです。 –

+0

このような状況では、cmpとは対照的にkeyを使用するには、正しい方法は 'sorted(nums、key = lambda x、y:y + x)'でしょうか?それは「価値そのものをとる」という意味ですか? – JohnDoe

+1

いいえ、 'sort'によって呼び出される関数は、ソートのために現在考慮されているリスト内の要素である単一の引数だけを取ることを意味します。あなたのラムダは、 'lambda x:'形式でなければなりません。これは、並べ替える要素の値を取得する単なる方法です。 intのようなプリミティブを使用しているときは、キー関数は必要ありません。あなたは本当に値そのものをソートできるだけなので、キー関数は 'lambda x:x'のようになります。これはデフォルトの振る舞いにキーがないものです。 –

答えて

1

の関数からインスピレーションを受けています。key関数の引数は1つだけです。あなたのキー関数に渡される値は、あなたのコレクションの要素であり、ソートされたバージョンのリスト内での位置付けのために現在考慮されています。実際の比較は行っていません。 sort関数は内部的にそれを行います。

cmpという別の機能があり、比較を実行します。より具体的な詳細については、docsを参照してください。

+0

これはほとんど動作します。最大の文字列を取得するには3が30よりも前に来なければならないので、逆順で数値を並べ替えることはできません。正しい比較関数は です。num.sort(cmp =ラムダx、y:cmp(y + x、x + y)) ' – JohnDoe

+0

あなたは正しいです。私はそのビットを実際の答えに無関係なものとして取り除きます。 –

+0

ご協力ありがとうございます! – JohnDoe

関連する問題