Python
python3
Pycharm

ゼロから始めるデータサイエンス 1章で使うリスト内包表記のエラーについて

python3で取り組んでいる方向け

p7の、「知り合いかも?」の部分のメソッドで、リスト内包表示に関するエラーがでました。

該当のメソッド
※少しだけ変数変えています

sample.py
#辞書型の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は()で囲む必要がでてきました。その為、下記のように修正します

sample.py
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を書く方法も紹介されていました。まとまっていて、めっちゃ綺麗でした。

終わりに

見てくださった方、ありがとうございました!