高階関数 functools.reduce(function, sequence, initial=None) は、
リストの存在チェック in Iterable の代用に書けますが、
わざわざ in Iterable の代わりに以下のように書くことはありません。
from functools import reduce list = ['a','b','c','d','e'] sts = reduce(lambda r,t:r or t=='c', list, False)
しかし、リストの要素が重複がないユニークであるか否かをチェックするのに
使うことができます。
それには、Java と違ってリスト追加の append メソッドが戻り値として
何も返さないという欠点を念頭におかなければなりません。
さらに、Pythonのラムダは複数行の処理を書くようになってないので、無理やり配列orタプルで
実行するように書いて、
addList = lambda b,a:(b in a, a.append(b))[0] status = addList('d', list)
この status は、True です。
これを踏まえて以下のように
reduce のイニシャライザに、(False, []) というタプルを指定することで、
if reduce(lambda r,t:(r[0] or addList(t, r[1]), r[1]), list, (False, []))[0]: print('重複あり') else: print('重複なし')
と、addList = lambda b,a:(b in a, a.append(b))[0] を使用して書けます。
この addList lambda を宣言せずに記述できるわけで、
if reduce(lambda r,t:(r[0] or (t in r[1], r[1].append(t))[0], r[1]), list, (False, []))[0]: print('重複あり') else: print('重複なし')
全て同じは、
if len(set(list)) == 1: print('全て同じ')
全てユニークは、
if len(list)==len(set(list)): print('全てユニーク')
と、書けるのだけれども、、
無理やりに reduce() で書くと、、
if reduce(lambda r, t:((r[1].append(t), r[1].count(t))[1], r[1]), list, (0, []))[0]==len(list): print('全て同一要素である') else: print('全て同一要素でない') if reduce(lambda r, t:(r[0] and (r[1].append(t), r[1].count(t)==1)[1], r[1]), list, (True, []))[0]: print('全てユニーク') else: print('重複あり')