質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

4回答

2890閲覧

classで作成したインスタンスをfor文で回す方法が知りたい。

atk_721

総合スコア62

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/08/14 11:47

編集2019/08/14 11:47

前提・実現したいこと

インスタンスをリストのように格納する関数を作成したいのですが、どのようなコードを書けばいいのでしょうか?

発生している問題・エラーメッセージ

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-223-7a22154e3b02> in <module> 20 21 for i in range(1,5): ---> 22 print('商品名:{0}, 価格 :{1},カロリー:{2}'.format(cake[i].name,cake[i].price,cake[i].calorie)) TypeError: 'Menu' object is not subscriptable

該当のソースコード

class Menu: def __init__(self,name,price,calorie): self.name = name self.price = price self.calorie = calorie def info(self): return 'name : {} , price : {} , calorie : {}'.format(self.name,self.price,self.calorie) drink1 = Menu('cola',120,50) drink2 = Menu('tea',60,20) drink3 = Menu('mineral water',100,10) drink4 = Menu('ryokucha',120,20) cake1 = Menu('monbrancake',500,600) cake2 = Menu('shortcake',600,300) cake3 = Menu('cheesecake',800,700) cake4 = Menu('macchacake',400,500) for i in range(1,5): print('商品名:{0}, 価格 :{1},カロリー:{2}'.format(cake[i].name,cake[i].price,cake[i].calorie))

試したこと

cake_list.append(cake1) cake_list.append(cake2) for i in range(1,3): print(cake_list[i].name) #monbrancake  shortcake

このようにすると取り出せるのですが、
cake1のすべてのname,price,calorieを
同時に取り出したいです。
もっとスマートな書き方が知りたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2019/08/14 11:56

> cake1のすべてのname,price,calorieを とありますがcake1はひとつずつのname,price,calorieしか持っていないので誤記か、不足があると思います。 発生している問題・エラーメッセージと該当のソースコードが合っていないようにも見えます(ソースコードにcakeがない)。 質問は修正可能ですので直すとよいでしょう。
guest

回答4

0

python

1from collections import namedtuple 2 3class Menu(namedtuple("_Menu", "name price calorie")): 4 def info(self): 5 return 'name : {} , price : {} , calorie : {}'.format(*self) 6 7drink = [Menu('cola', 120, 50), 8 Menu('tea', 60, 20), 9 Menu('mineral water', 100, 10), 10 Menu('ryokucha', 120, 20)] 11 12cake = [Menu('monbrancake', 500, 600), 13 Menu('shortcake', 600, 300), 14 Menu('cheesecake', 800, 700), 15 Menu('macchacake', 400, 500)] 16 17for name, price, calorie in cake: 18 print('商品名:{0}, 価格 :{1},カロリー:{2}'.format(name, price, calorie))

もしくは

python

1for item in cake: 2 print('商品名:{0}, 価格 :{1},カロリー:{2}'.format(*item))

投稿2019/08/14 13:10

編集2019/08/14 13:11
YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

atk_721

2019/08/15 06:55

回答ありがとうございます。 後者の書き方なのですが、.format(*item)の所の処理がどうなっているのか分からないのですがソースなどは無いでしょうか?個人的にとてもスッキリしていて良いなと思いました。
YouheiSakurai

2019/08/15 07:05

「.format(*item)」は「.format(item[0], item[1], item[2], ...)」というふうに引数を展開するときの書き方です。この例では、itemはnamedtupleを元に定義されているので、item[0]とitem.name、item[1]とitem.price、item[2]とitem.calorieが対応するので、最終的に「.format(*item)」と「.format(item.name, item.price, item.calorie)」が同義になるという仕掛けです。
atk_721

2019/08/15 07:22

回答ありがとうございます!まさに探していた物でした。とても勉強になりました。
guest

0

インスタンスをリストのように格納する

そのままリストを使えば良いのでは。

Python

1cakes = [ 2 Menu('monbrancake', 500, 600), 3 Menu('shortcake', 600, 300), 4 Menu('cheesecake', 800, 700), 5 Menu('macchacake', 400, 500), 6] 7 8for cake in cakes: 9 print('商品名:{0}, 価格 :{1},カロリー:{2}'.format(cake.name, cake.price, cake.calorie))

投稿2019/08/14 11:51

LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

atk_721

2019/08/14 12:01

素早い回答ありがとうございました。納得出来ました。
guest

0

次のコードを研究してみてください。
x.py

python3

1class Menu: 2 def __init__(self, name, price, calorie): 3 self.name = name 4 self.price = price 5 self.calorie = calorie 6 7 def __str__(self): 8 return '商品名: {}, 価格: {}, カロリー: {}'.format(self.name, self.price, self.calorie) 9 10 def attributes(self): 11 return {'商品名': self.name, '価格': self.price, 'カロリー': self.calorie} 12 13cake1 = Menu('monbrancake', 500, 600) 14cake2 = Menu('shortcake', 600, 300) 15cake3 = Menu('cheesecake', 800, 700) 16cake4 = Menu('macchacake', 400, 500) 17 18cakes = [cake1, cake2, cake3, cake4] 19for cake in cakes: 20 print(cake) 21 22print() 23drinks = [ 24 Menu('cola', 120, 50), 25 Menu('tea', 60, 20), 26 Menu('mineral water', 100, 10), 27 Menu('ryokucha', 120, 20) 28] 29[print(drink) for drink in drinks] 30 31print() 32orders = [] 33orders.append(cakes[0]) 34orders.append(drinks[1]) 35orders.append(drinks[2]) 36 37print("ご注文") 38[print("{:10}: {}".format(x.price, x.name)) for x in orders] 39print("合計:", sum([x.price for x in orders]))

実行例
イメージ説明

投稿2019/08/17 06:45

編集2019/08/17 06:49
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

atk_721

2019/08/17 08:14

回答ありがとうございます。勉強になります。動かしてみたのですが処理の流れがいまいち掴めません、、、インスタンスを作成すると同時に__str__がreturnで出力しているのだと思うのですが、__Attributes__も呼び出されているはずなのに、、、よろしければこの書き方が説明されているソースのようなものがあれば紹介していただきたいです。
atk_721

2019/08/17 08:17

[print("{:10}: {}".format(x.price, x.name)) for x in orders] この書き方は大変勉強になりました。
atk_721

2019/08/17 18:31

詳しいソースありがとうございます。助かりました。
guest

0

ベストアンサー

例えば、こういう書き方を思いつきます。

python

1class Menu: 2 def __init__(self, name, price, calorie): 3 self.name = name 4 self.price = price 5 self.calorie = calorie 6 7 def info(self): 8 return '商品名:{0}, 価格 :{1}, カロリー:{2}'.format(self.name, self.price, self.calorie) 9 10 11cake_list = [ 12 Menu('monbrancake', 500, 600), 13 Menu('shortcake', 600, 300), 14 Menu('cheesecake', 800, 700), 15 Menu('macchacake', 400, 500), 16] 17 18for cake_menu in cake_list: 19 print(cake_menu.info())

商品名:monbrancake, 価格 :500, カロリー:600 商品名:shortcake, 価格 :600, カロリー:300 商品名:cheesecake, 価格 :800, カロリー:700 商品名:macchacake, 価格 :400, カロリー:500

投稿2019/08/14 11:54

mokemokechicken

総合スコア948

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

atk_721

2019/08/14 12:00

すぐに回答していただきありがとうございました。 分かり易かったです。自分には思いつきませんでした、、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問