複雑なリスト内包表記に陥ったり、複雑なことを行う方法を理解しようとしたり、方法がわからない場合はいつでも、答えは通常、物事を分割することです。式の構文は、Python の完全なステートメント (または複数ステートメント スイート) の構文よりも本質的に制限されているため、後で読むことができないものを作成することはできません。通常、それは良いことですが、そうでない場合でも、それと戦おうとするよりも、それに沿った方がよいでしょう.
この場合、if
式としての書き方がわからない句を除いて、自明な理解が得られます。したがって、条件を別の関数に変換します。
def isMyKindOfKey(k):
… condition here
[(k,v) for (k,v) in dict_bigrams.items() if isMyKindOfKey(k)]
これにより、条件に完全なマルチステートメント構文を使用できます。また、条件に名前を付けることもできます (できれば よりも優れた名前を付けることができますisMyKindOfKey
)。パラメータ、クロージャーによってキャプチャされたローカル値などをより明示的にします。関数を個別にテストしたり、再利用したりできます。等
ループ自体が重要な部分である (または入れ子がたくさんある) 場合は、通常、理解全体を明示的な for ループに分割して追加する方が理にかなっていますが、ここでは必要ないと思います。
この場合、一般にそうであるように、これで問題が魔法のように解決されるわけではなく、より柔軟に解決できることに注意してください。たとえば、 FJ が提案する後置からif
中置への同じ変換を使用できますが、次のor
ようにそのままにしておくこともできますif
。
def isMyKindOfKey(k):
retval = k[:pos_qu]==selection[:pos_qu]
if pos_qu!=1:
retval = retval and (k[pos_qu+1:]==selection[pos_qu+1:])
retval = retval and (k[pos_qu] not in alphabet.values())
return retval
これは実際には私が書く方法ではないかもしれませんが、これが、頭の中にあるものをコードに変換する簡単な方法であることがわかります。これを式で行うのは非常に困難です。