0

私はPythonを初めて使用し、次のタプルのリストを並べ替えようとしています。

>>> str
[('991', 'Shantell'), ('992', 'Cherish'), ('993', 'Linsey'), ('994', 'Hali'), ('995', 'Tarah'), ('996', 'Annemarie'), ('997', 'Asha'), ('998', 'Jada'), ('999', 'Leila'), ('1000', 'Peggy')]

タプルの最初の値に基づいてソートしたいのですが、残念ながら、各タプルの最初の値は文字列であり、整数ではありません。私はこれを行うキー関数を作成できることを知っています:

def digit_key(t):
    return (int(t[0]))

次に、次のように並べ替えて呼び出します。

>>> sorted(str,key=digit_key)
[('991', 'Shantell'), ('992', 'Cherish'), ('993', 'Linsey'), ('994', 'Hali'), ('995', 'Tarah'), ('996', 'Annemarie'), ('997', 'Asha'), ('998', 'Jada'), ('999', 'Leila'), ('1000', 'Peggy')]

ソートする前に常にキー関数を定義する必要がありますか?2つの関数を定義せずにこのコードを書くためのより良い方法はありますか?私は次のことを試みましたが失敗しました:

>>> sorted(str,key= int(str[0][0]))
Traceback (most recent call last):
  File "<pyshell#1112>", line 1, in <module>
    sorted(str,key= int(str[0][0]))
TypeError: 'int' object is not callable
4

3 に答える 3

2

できるよ:

sorted(str,key=lambda x: int(x[0]))

は、(このlambda場合は少なくとも) と同等のインライン関数を作成しますdigit_key。それが「よりきれい」かどうかはわかりませんが、冗長性が低く、ほとんどの人がおそらく使用するものです.

于 2013-03-05T21:55:17.193 に答える
2

はい。ラムダ ステートメント:

sorted(str, key= lambda a: (int(a[0])) )

基本的に、インライン関数を宣言する簡潔な方法です。構文は、lambdaキーワードの後に​​引数 (コンマで区切る)、コロン、関数が返すステートメントが続きます。

lambda <arg...> : <statement>
于 2013-03-05T21:55:37.397 に答える
2

関数の定義を実際に避けたい場合lambdaは、役に立ちません。関数を定義する別の方法です。高階関数を使用して、定義せずに関数を作成できます。

sorted(str, key=functional.compose(int, operator.itemgetter(0)))

(モジュール (または関数functionalの他のソース) と との両方をインストールする必要があります。)composeimportfunctionaloperator

しかし、それは「定義」の定義をごまかすようなものであり、確かにPythonicではありません。

一方、最も美しいコード、または最も Pythonic なコード、または最もメンテナンスしやすいコードが必要な場合は、すでにそれを入手している可能性があります。

通常、関数に名前を付けると読みやすくなります。

また、デバッグがはるかに簡単になります。lambda foo: bar(baz(foo), qux(foo))が正しいことをしていない場合は、それを修正する前に、それが何をしているのかを推測する必要があります。関数に名前がある場合は、推測する必要はありません。名前が示すとおりのことを行っているはずです。

アウトオブラインで定義するということは、コピー&ペーストせずに複数の場所で使用できることも意味します。

そして、それを単体テストできます。

そして、多くの場合、より効率的です。

無駄なコードを 1 行書くだけで済みます。それは本当に受け入れられないのですか?

明らかに、十分に単純なケースでlambdaは、多くの場合、読みやすくなっています。しかし、それが実際に必要になることは決してなく、簡潔さと明確さの間には常にトレードオフがあります。

于 2013-03-05T22:14:12.310 に答える