1. ホーム
  2. python

[解決済み] Pythonのラムダ式で複数のステートメントを持つことは可能ですか?

2022-06-16 18:44:23

質問

私はpythonの初心者で、以下のことを達成しようとしています。

私はリストのリストを持っています。

lst = [[567,345,234],[253,465,756, 2345],[333,777,111, 555]]

lst を、各サブリストから 2 番目に小さい数字だけを含む別のリストにマップしたい。したがって、結果は次のようになるはずです。

[345, 465, 333]

例えば一番小さい数字にだけ興味があれば、こうなります。

map(lambda x: min(x),lst)

こんなことできたらいいな。

map(lambda x: sort(x)[1],lst)

のようになりますが、sortは連鎖しません。(Noneを返す)

も、このようなことは許されません。

map(lambda x: sort(x); x[1],lst) #hence the multiple statement question

pythonのmapでこれをやる方法はないでしょうか。 という名前の関数を定義することなく ? (例えば、rubyの匿名ブロックでは簡単です)

どのように解決するのですか?

具体的な質問から、より一般的な問題まで、いくつかの異なる回答があります。つまり、最も具体的なものから最も一般的なものまでということです。

Q. lambdaの中に複数の文を入れることは可能でしょうか?

A. いいえ。しかし、実際にはラムダを使う必要はありません。 あなたはステートメントを def の代わりに、すなわち

def second_lowest(l):
    l.sort()
    return l[1]

map(second_lowest, lst)

Q. lambdaからリストをソートして2番目に低い項目を得ることができますか?

A. はい。 として アレックスの回答 が指摘しているように sorted() は、その場でソートするのではなく、新しいリストを作成するソートのバージョンで、連鎖させることができます。 これはおそらくあなたが使用すべきものであることに注意してください - あなたのマップが元のリストに副作用を与えるのは悪い習慣です。

Q. 一連のリストの中で、各リストから2番目に小さい項目を取得するにはどうしたらよいでしょうか?

A. sorted(l)[1] は、実はこのための最良の方法ではありません。 O(N log(N))の複雑さを持ちますが、O(n)の解法が存在します。 これはheapqモジュールで見つけることができます。

>>> import  heapq
>>> l = [5,2,6,8,3,5]
>>> heapq.nsmallest(l, 2)
[2, 3]

だから、使うだけでいい。

map(lambda x: heapq.nsmallest(x,2)[1],  list_of_lists)

また、通常、ラムダを完全に回避するリスト内包を使用する方が明確であると考えられています。

[heapq.nsmallest(x,2)[1] for x in list_of_lists]