リストのリストがあります:
lst = [[567, 345, 234], [253, 465, 756, 2345], [333, 777, 111, 555]]
各サブリストから 2 番目に小さい数値のみを含む別のリストにマップしますlst
。したがって、結果は次のようになります[345, 465, 333]
。
最小の数字だけに興味があるなら、これを と書くことができますmap(lambda x: min(x), lst)
。2番目に小さい数字を取得するには、 のように結果をソートしてインデックスを付けることを考えましたmap(lambda x: sort(x)[1], lst)
。しかし、sort
連鎖ではなくNoneを返す。
内で複数のステートメントを使用できる場合はlambda
、 と記述できますmap(lambda x: sort(x); x[1], lst)
が、これは許可されていません。
map
名前付き関数を定義せずに問題を解決するために使用できますか? 方法は?
ベストアンサー1
ここでは、具体的な質問からより一般的な懸念まで、いくつかの異なる回答が考えられます。最も具体的なものから最も一般的なものまで、次のとおりです。
質問。ラムダに複数のステートメントを入れることはできますか?
A.いいえ。ただし、実際にラムダを使用する必要はありません。代わりにステートメントを に入れることができますdef
。例:
def second_lowest(l):
l.sort()
return l[1]
map(second_lowest, lst)
質問。リストをソートすることでラムダから 2 番目に低い項目を取得できますか?
A.はい。アレックスの答え指摘されているように、sorted()
これは sort のバージョンであり、インプレースでソートするのではなく、新しいリストを作成し、連鎖させることができます。おそらくこれが使用すべきものであることに注意してください。マップが元のリストに副作用をもたらすのは悪い習慣です。
質問。一連のリスト内の各リストから 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]