質問: line.rstrip().split(",") 4、 print(enemy[0] + "が" + enemy[1] + "匹現れた") [コード終わり] [入力] スライム,30 モンスター,23 ゾンビ,15 ドラゴン,3 魔王,1 [ループ一周目の流れ] 3の時点で 一つ目のリストである”スライム,30”がリストから選択されて、それがカンマで区切られて、enemy[スライム,30]となっています。 for loop in内なので、リストの一つ目である”スライム,30”が3行目のlineには入っている。そしてsplit・・・ [質問点1] スライム,30 ・・・ 魔王,1 がそれぞれlineリスト内の要素として、分離されたのはどの時点でしょうか? [質問点2] readlines ではなreadだと失敗する理由を教えてください。
回答: まずはじめに、入力された値は改行が入ったひとつの**文字列**です。(\n は改行を意味します) `スライム,30 \nモンスター,23 \nゾンビ,15 \nドラゴン,3 \n魔王,1` つぎに、readlines() を使うと、このひとつの**文字列**が改行で分割され**リスト**として返ってきます。 ``` [ "スライム, 30", "モンスター,23 ", "ゾンビ,15 ", "ドラゴン,3 ", "魔王,1" ] ``` この結果を for ループで回すことによって、リストの各要素:"スライム, 30" → "モンスター,23 " → ・・・ の**文字列**が順に `line` に代入されていきます。 そして最後に、split() を使って、`スライム, 30` がカンマによって分割され、**リスト**:`['スライム', '30'] になります。 というわけで、[質問点1] の**リスト**に分割されるタイミングは、readlines() したタイミングです。 また、[質問点2] ですが、read() はリストへの分割をせず、まるごと1つの**文字列**として取り込まれます。さらに文字列を for ループで回すと、1文字ずつ分割される仕様になっていますので、"ス" → "ラ" → "イ" → "ム" → ・・・ となっていきます。1文字を split(",") にしても分割できないので、enemy[1] は存在せず out of range エラーとなります。 文字列 と リスト/辞書/タプル は混同しやすいので、今後解説サイト等を見る際に意識してみてください。理解がぐっと進むと思います。