検索ガイド -Search Guide-

単語と単語を空白で区切ることで AND 検索になります。
例: python デコレータ ('python' と 'デコレータ' 両方を含む記事を検索します)
単語の前に '-' を付けることで NOT 検索になります。
例: python -デコレータ ('python' は含むが 'デコレータ' は含まない記事を検索します)
" (ダブルクオート) で語句を囲むことで 完全一致検索になります。
例: "python data" 実装 ('python data' と '実装' 両方を含む記事を検索します。'python data 実装' の検索とは異なります。)
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
>>

【Python 雑談・雑学】 list comprehension (リスト内包表記) は節度を持って使ってください、という話 投稿一覧へ戻る

Published 2020年5月21日20:21 by mootaro23

SUPPORT UKRAINE

- Your indifference to the act of cruelty can thrive rogue nations like Russia -

渡されたコードをチェックしていたら、こんな感じの内包表記が含まれていました。


friends = ["Nana", "Saki", "Yuka"]
guests = ["Taro", "Nana", "jiro", "saki", "saburo", "shiro", "Hana"]

present_friends = [ name.title() for name in guests if name.lower() in [f.lower() for f in friends]]
print(present_friends)

# ['Nana', 'Saki']





パーティーに出席した人(guests)の中にいた友達(friends)を、最初の文字を大文字にして出力しています。

やろうとしていることは分かります。

ただ、読み辛いです。大歓迎ではないです。

少し見た目を変えてみます。


present_friends = [
name.title()
for name in guests
if name.lower() in [f.lower() for f in friends]
]
print(present_friends)



パッと見た目に少しは理解しやすくなったでしょうか?

ただ、if 文の中にもう1つ内包表記が入っているのでちょっと分かり辛くなっています。

外に出しちゃいましょう。


friends_lower = [f.lower() for f in friends]
present_friends = [
name.title()
for name in guests
if name.lower() in friends_lower
]
print(present_friends)



せめてこんな感じでしょうか。

list comprehension は便利ですけど、乱用は禁物ですね。

おまけですが、set comprehension を利用して、こんなコードも書けます。


friends_lower = {friend.lower() for friend in friends}
guests_lower = {guest.lower() for guest in guests}

print({friend.title() for friend in friends_lower.intersection(guests_lower)})



このセット内包表記は、


friends_lower = set([friend.lower() for friend in friends])



の短縮版です。

ただ、取得するのは Set ですから、リスト内の順番は保証されません。

もし、リストの順番が何か意味を持ち(例えば、パーティーに来た人の順番)、その情報をなくしてはいけない場合は使えません。
この記事に興味のある方は次の記事にも関心を持っているようです...
- People who read this article may also be interested in following articles ... -
【 Effective Python, 2nd Edition 】入力元のデータサイズが大きい場合は、リスト内包表記 ( list comprehension ) ではなくジェネレータ式 ( generator expression ) の利用を検討しよう!
【Python 雑談・雑学 + coding challenge】文字列中の数字を抜き出して桁区切りをつけよう! 正規表現 (regular expression ) を使うと「えっ!?」っていうくらい簡単ですょ。lookahead と negative lookahead を使います。
【Python 雑談・雑学 + coding challenge】comprehension は確かに Pythonic ですけど、map 組み込み関数と使い分けることも必要ですね!
【 Effective Python, 2nd Edition 】内包表記に含める for 文や if 文の数は2つ位までに抑えておかないと読解性が極端に悪くなりますよ、という話
【Python 雑談・雑学 + coding challenge】Python の pprint 機能を自分で実装してみよう! 自分なりの Pretty Print できちゃいます!!
【Python 雑談・雑学】メタクラス ( metaclass ) とデコレータ ( decorator ) で遊んでみる、考えてみる!
【Python 雑談・雑学 + coding challenge】Python data structure の1つ、set を活用していますか? 複数のシーケンスの包含関係を調べるには最適です