LoginSignup
4
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-11-22

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

終わりに

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

4
2
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2