#python3で取り組んでいる方向け
p7の、「知り合いかも?」の部分のメソッドで、リスト内包表示に関するエラーがでました。
該当のメソッド
※少しだけ変数変えています
#辞書型のusersにfriendsを追加する工数は省略させていただきます。
users = [
#0番目のユーザーはidが1,2,5の知り合いがいる可能性があります
{"id": 0, "name": "Hero","friends":[{"id": 1, "name": "Dunn"},{"id": 2, "name": "Sue"},{"id": 5, "name": "Clive"}]},
#1番目のユーザーはidが0,2,6の知り合いがいる可能性があります
{"id": 1, "name": "Dunn","friends":[{"id": 2, "name": "Sue"},{"id": 0, "name": "Hero"},{"id": 6, "name": "Hicks"}]}
]
"""
下記のリスト内包表示では、n番目のuserが友達の可能性があるユーザーをループカウンタ変数のfriendとして
探し出し、friendのidをリストとして返すよう書いています。
"""
#=============ここでエラーが出る!!=============
print [friend["id"] for friend in users[0]["friends"]]
#>>> 正しければ[1,2,5]が出力されるはずです。
print [friend["id"] for friend in users[1]["friends"]]
#>>> 正しければ[0,2,6]が出力されるはずです。
##printはpython3から関数になっていた
下記のエラーが発生しました。
syntaxError: Missing parentheses in call to 'print'
python3よりprintは()で囲む必要がでてきました。その為、下記のように修正します
print(friend["id"] for friend in users[0]["friends"])
#>>> 正しければ[1,2,5]が出力されるはずです。
print(friend["id"] for friend in users[1]["friends"])
#>>> 正しければ[0,2,6]が出力されるはずです。
#しかし、出力は下記のとおりでした
>>>print(friend["id"] for friend in users[0]["friends"])
<generator object <genexpr> at 0x1028cc830>
generatorが出力されました。
ググってみたのですが、あまりピンとくる答えを見つけられませんでした。
※何を参考にするべきかおしえていただけますと幸いです。
そのため、usersがどのように出力されているか確認したところ、friendsはリストだと判明しました。
そもそも、リスト内包表示のために書いていたのだと思い出し、下記のように修正したところ、無事出力されました。
#正解はこちらです!
>>>print([friend["id"] for friend in users[0]["friends"]])
[1, 2, 5]
>>> print([friend["id"] for friend in users[1]["friends"]])
[2, 0, 6]
#リスト内包表記
なぜリスト内包表記を使うのかも学んだので、書いておきます。
今回のfor文は、他のプログラミング言語のようにかけます。
#空のリストを作成
list = []
for friend in users[0]["friends"]:
#カラのリストに友達の可能性があるuserのidを追加
list.append(friend["id"])
print(list)
#[1, 2, 5]
改めて比較してみましょう!
>>>print([friend["id"] for friend in users[0]["friends"]])
[1, 2, 5]
だいぶ短くなりましたね!
リスト内包表記によるメリットは、書く行数が減るのみではないようです。
・実行速度がはやい
・if文を書きやすい(rubyみたいに書ける)
などなど
参考:@y__samaさん「pythonの内包表記を少し詳しく」
一行でfizzbuzzを書く方法も紹介されていました。まとまっていて、めっちゃ綺麗でした。
#終わりに
見てくださった方、ありがとうございました!