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

Tags: Python , miscellaneous , comprehension , set , list

Published 2020年5月21日20:21 by T.Tsuyoshi

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


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 ですから、リスト内の順番は保証されません。

もし、リストの順番が何か意味を持ち(例えば、パーティーに来た人の順番)、その情報をなくしてはいけない場合は使えません。

この投稿をメールでシェアする

0 comments

コメントはまだありません。

コメントを追加する(不適切と思われるコメントは削除する場合があります)