上級Python開発コース
チャプター
>
レベル
高度なリスト
リスト内包表記
この章では、Python におけるリストの新しい活用方法を探求します。最適化、コンパートメンテーション、さらにはテーブルに非常に近い形状の大規模な多次元リスト(マトリックス)の作成についても取り上げます。
このレベルでは、リスト内包表記に取り組みます。リスト内包表記とは、他のリストから特定の要素だけを選択することで新しいリストを作成する方法です。リストを手動で入力したり、複雑な自動化を考案したりすることなく、非常にシンプルな1行のコードで実現できます。

目的
リスト内包表記を使って、パントリーにあるすべての根菜を取り出し、正しい場所に保管できるように整頓してください。
パントリーには、根菜がたっぷり入ったいくつかの袋があり、これらは potatoes 、 onions 、および garlic となっています。しかし、劣化した野菜が混ざっている可能性があります。食べられる野菜を取り出し、本来保管すべき箱に入れてください。
これを達成するためには、各袋の中に何が入っているかを確認する必要があります。各袋の情報を保持している3つのリスト定数があり、これらはそれぞれ left_sack 、 middle_sack 、 right_sack と名付けられています。これらのリスト定数は、その名前で示された場所にある袋に対応しています。
各袋の前にあるライトのXマークまで歩み、その定数を使って speak() 関数で各袋の中身を確認してください。例えば、player.speak(left_sack) のようにします。各袋の中身が確認できたら、名前に "Bad" や "Spoiled"、もしくは "Rotten" を含む野菜など、除去すべきアイテムを特定してください。
食用に適したアイテムだけを含む新しいリストを作成する必要があります。これを手動で行うことも可能ですが、時間がかかり混乱を招く恐れがあります。より効率的にこれを達成するために、あるリストから新たなリストを作成する方法があり、これは リスト内包表記 として知られています。
3つのリスト定数、すなわち left_sack 、 middle_sack 、 right_sack から、袋内に不要なアイテムを含まない新しいリスト potatoes 、 onions 、 garlic をそれぞれ作成してください。リスト内包表記 を使えば、膨大なコードを書かずに新しいリストを作成することができます。例えば:
# Original list sack = ["Potatoes", "Sweet Potatoes", "Spoiled Potatoes" ] # List Comprehension potatoes = [x for x in sack if not "Spoiled" in x] # This will create a list named potatoes with: # ["Potatoes", "Sweet Potatoes"]
上記の例では、リスト sack から potatoes というリストが作成され、["Potatoes", "Sweet Potatoes"] のみが含まれ、"Spoiled Potatoes" は除外されています。これは、リスト内の各要素を走査するためのインデックスとして x を使用し、for / in 文を利用して不要な要素(この場合、"Spoiled" を含む文字列)を特定・除外する自己完結型の for ループを作成することで達成されています。
まとめると、speak() 関数を使用して各リスト定数に "Bad"、"Spoiled"、または "Rotten" が含まれているか確認し、リスト内包表記 を用いて各リストから不要な要素を除外したリスト potatoes 、 onions 、 garlic を作成してください。
これらのリストが作成されたら、野菜のサインが付いた箱の前にある3つの金色のXマークまで歩み、place() 関数を使用して各リストを対応する箱に配置し、レベルを完了させてください。サインで示された場所は、左の箱に onions 、中央の箱に potatoes 、左の箱に garlic となっています。