Pythonの内包表記は便利ですが、ちょっと複雑なことをしようとすると、多段階にネストすることになってしまいます。そして、ネストすると可読性が著しく落ちます。このため、ネストの階層が深くなったら、ブロック表記に書きなおしている人も多いのではないかと思います。
しかし、ルールを決めてインデントすれば、ネストしても可読性を損ないません。たとえば以下のような形です。
itemList = [
(item.name, item.price)
for item in record.items()
for purchase in purchases
if purchase.campaignName in {
campaign.name
for campaign in camapigns
} and purchase.date > datetime.date.today() - datetime.timedelta(days = 7)
]
- 内包表記の外側の括弧のインデントを揃え、中身を一つインデントさせる。
- 要素, for句, (for句)...,(if句)で分割する。
ちょっと慣れは必要かもしれませんが、慣れればブロック表記よりもずっと読みやすくなります。ブロック表記だと、内包表記では不必要なリスト保存用の変数が増えて可読性が落ちることを考えると、内包表記で無制限にネストできることのメリットはかなり大きいと思います。