【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 -
渡されたコードをチェックしていたら、こんな感じの内包表記が含まれていました。
パーティーに出席した人(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 ですから、リスト内の順番は保証されません。
もし、リストの順番が何か意味を持ち(例えば、パーティーに来た人の順番)、その情報をなくしてはいけない場合は使えません。
この記事に興味のある方は次の記事にも関心を持っているようです...
- People who read this article may also be interested in following articles ... -