多数の特定キーワードを含むか、を長々とifステートメントで書くの嫌だから短くしてみた
リストについてループ処理をしていて、特定キーワードを含んだものだったらcontinue.という処理を書いているのだが、
if KEYWORD in STRING:continue
とすると、キーワードが多くなると↓のようにすごい面倒になる。
for row in LIST: (省略) if KEYWORD1 in STRING:continue if KEYWORD2 in STRING:continue if KEYWORD3 in STRING:continue ...
かと言って↓のような処理もいまいち…ってか、こんな書き方あるの?少し調べたけど分かんなかった。JavaScriptではあったと思うんだけど。
for row in List:outer_loop for keyword in KEYWORD_LIST:inner_loop if keyword in row: continue outer_loop
そこでlambda式とかmap関数が使えないかと思い、試してみた。
for row in LIST: matrix = map((lambda key: key in row),['KEYWORD1','KEYWORD2','KEYWORD3']) if bool(set(matrix) - set([False,False,False])):continue#一箇所でもTrueがあるか?
rowがすべてのキーワードを含まない場合、matrix = [False,False,False]となり、一つでもキーワードを含む場合はmatrix = [False,True,False]のようになる。そしてset関数で集合オブジェクトを生成して、差集合の真偽値を判定する。
つまり、set関数で重複しない要素の集合(A)を作り、要素として False のみを持つ集合(B)との差集合を取る(AにB以外の要素があるか?)。A = Bの場合、差集合は空集合となり真偽値はFalseとなる。差集合に要素がある場合は真偽値は真となる。