【Python 雑談・雑学】 list comprehension (リスト内包表記) は節度を持って使ってください、という話 投稿一覧へ戻る
Published 2020年5月21日20:21 by T.Tsuyoshi
渡されたコードをチェックしていたら、こんな感じの内包表記が含まれていました。
パーティーに出席した人(guests)の中にいた友達(friends)を、最初の文字を大文字にして出力しています。
やろうとしていることは分かります。
ただ、読み辛いです。大歓迎ではないです。
少し見た目を変えてみます。
パッと見た目に少しは理解しやすくなったでしょうか?
ただ、if 文の中にもう1つ内包表記が入っているのでちょっと分かり辛くなっています。
外に出しちゃいましょう。
せめてこんな感じでしょうか。
list comprehension は便利ですけど、乱用は禁物ですね。
おまけですが、set comprehension を利用して、こんなコードも書けます。
このセット内包表記は、
の短縮版です。
ただ、取得するのは Set ですから、リスト内の順番は保証されません。
もし、リストの順番が何か意味を持ち(例えば、パーティーに来た人の順番)、その情報をなくしてはいけない場合は使えません。
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)
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)
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)
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)})
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 ですから、リスト内の順番は保証されません。
もし、リストの順番が何か意味を持ち(例えば、パーティーに来た人の順番)、その情報をなくしてはいけない場合は使えません。
こちらの投稿にも興味があるかもしれません...
- 【Python 雑談・雑学 + coding challenge】Python data structure の1つ、set を活用していますか? 複数のシーケンスの包含関係を調べるには最適です
- 【Python 雑談・雑学 + coding challenge】comprehension は確かに Pythonic ですけど、map 組み込み関数と使い分けることも必要ですね!
- 【Python 雑談・雑学 + coding challenge】Unicode の正規化処理 ( normalization ) を利用して、diacritical marks ( 発音区別符号 ) を取り除こう! テキスト解析の前処理としても重要です!
- 【Python 雑談・雑学 + coding challenge】文字列中の数字を抜き出して桁区切りをつけよう! 正規表現 (regular expression ) を使うと「えっ!?」っていうくらい簡単ですょ。lookahead と negative lookahead を使います。
0 comments
コメントはまだありません。
コメントを追加する(不適切と思われるコメントは削除する場合があります)