2017-10-23 5 views
1
self.food_list = [['apple', 100, 'Fruit', 384.0], ['orange', 100, 'Fruit', 384.0]] 

3. の予想される出力はTotal calorie of all food is 768.0KcalTypeError例外:「食品」オブジェクトがサポートされていないインデックス私はインデックスから要素を合計する

def totalCalorie(self): 
    for i in range(0, len(self.food_list)): 
     j = self.food_list[i][3] 
     j += j 
    print("Total calorie of all food is {}Kcal".format(j)) 

である。しかし、次のエラーが出てきた:

Traceback (most recent call last): 
    File "D:/PythonTim/Assignment/nutritionDriver.py", line 60, in <module> 
    main() 
    File "D:/PythonTim/Assignment/nutritionDriver.py", line 43, in main 
    patient.totalCalorie() 
    File "D:\PythonTim\Assignment\nutritionApp.py", line 132, in totalCalorie 
    j = self.food_list[i][3] 
TypeError: 'Food' object does not support indexing 

私がしたいことは、ユーザーがリスト内のすべてのカロリーを合計したい場合、システムはリストからの総カロリーを表示することです。

別の方法がありますか?ありがとう!

EDIT:あなたのコードを実行しているとき、私は何の問題が表示されていない

class Food: 
    def __init__(self, name, quantity, category, calorie): 
     self.name = name 
     self.quantity = quantity 
     self.category = category 
     self.calorie = calorie 

class FoodList: 

    def __init__(self): 
     self.food_list = [] 

    def totalCalorie(self): 
     j=0 
     for i in self.food_list: 
      j += i[3] 
     print("Total calorie of all food is {}Kcal".format(j)) 

    def addFood(self, newfruit): 
     self.food_list.append(newfruit) 

name = input("Name? ") 
quantity = input("Quantity? ") 
category = input("Category? ") 
calorie = input("Calorie? ") 
f = Food(name, quantity, category, calorie) 
patient = FoodList() 
patient.addFood(f) 

name1 = input("Name? ") 
quantity1 = input("Quantity? ") 
category1 = input("Category? ") 
calorie1 = input("Calorie? ") 
f1 = Food(name1, quantity1, category1, calorie1) 
patient.addFood(f1) 

patient.totalCalorie() 
+2

あなたはself.food_listに期待する価値があると確信していますか?私はあなたのコードをコピーするときに動作します。 (あなたのj + = jのロジックに欠陥がありますが、それはエラーの原因ではありません) –

+3

クラス全体を提出してください –

+0

タイプ(self.food_list)を印刷しようとするとどうなりますか? –

答えて

1

(私はあなたがそれを与えていないので、クラスを想像していました)。

class Food: 
    def __init__(self): 
      self.food_list = None 
    def totalCalorie(self): 
      for i in range(0, len(self.food_list)): 
        j = self.food_list[i][3] 
        j += j 
      print("Total calorie of all food is {}Kcal".format(j)) 

f = Food() 
f.food_list = [['apple', 100, 'Fruit', 384.0], ['orange', 100, 'Fruit', 384.0]] 
f.totalCalorie() 

出力: "すべての食品の総カロリーが768.0Kcalある"

PS:

としては、ルーカスが指摘:私はPython2.7

EDIT 1を使用していますあなたの記事のコメントには「あなたのj + = jの論理に欠陥があります」

class Food: 
    def __init__(self): 
     self.food_list = None 

    def totalCalorie(self):   
     total = 0   
     for i in range(0, len(self.food_list)): 
      j = self.food_list[i][3] 
      total += j 
     print("Total calorie of all food is {}Kcal".format(total)) 

EDIT 2:

  1. あなたは食品オブジェクトにインデックスを使用しようとしている:

    今、私はあなたの全体のコードを持っていることを、私は強調することができる2つの問題がありますあなたのFoodオブジェクトはあなたがそれを構築した方法をインデックス化することをサポートしていません。実際にインデックスをサポートするオブジェクトを使用したい場合はthis (from doc)またはthisを読んでください。 とにかく、あなたのFoodオブジェクトインスタンスの属性「カロリー」にアクセスすることで、この問題を簡単に解決できます。したがってj += i[3]j += i.calorieになりますが、それは機能しません(ポイント2を参照)。

  2. 入力は文字列を返します。カロリーは、文字列であり、あなたがj += float(i.calorie)を行う必要がありますかあなたは(Pythonは、Javascriptのとは異なり、文字列と整数の連結を受け入れていない)

が最後にあなたのコードは、このなるとTypeError例外を取得します:

class Food: 
    def __init__(self, name, quantity, category, calorie): 
     self.name = name 
     self.quantity = quantity 
     self.category = category 
     self.calorie = calorie 


class FoodList: 

    def __init__(self): 
     self.food_list = [] 

    def totalCalorie(self): 
     j = 0 
     for i in self.food_list: 
      j += float(i.calorie) 
     print("Total calorie of all food is {}Kcal".format(j)) 

    def addFood(self, newfruit): 
     self.food_list.append(newfruit) 


name = input("Name? ") 
quantity = input("Quantity? ") 
category = input("Category? ") 
calorie = input("Calorie? ") 
f = Food(name, quantity, category, calorie) 
patient = FoodList() 
patient.addFood(f) 

name1 = input("Name? ") 
quantity1 = input("Quantity? ") 
category1 = input("Category? ") 
calorie1 = input("Calorie? ") 
f1 = Food(name1, quantity1, category1, calorie1) 
patient.addFood(f1) 

patient.totalCalorie() 

出力:

Name? apple 
Quantity? 100 
Category? Fruit 
Calorie? 384.0 
Name? Coq_au_vin 
Quantity? 1 
Category? Delicious_meal 
Calorie? 142000.0 
Total calorie of all food is 142384.0Kcal 

私はこれに役立っている願っていますが、私はコメントで言ったように、あなたは本当に「ヘッドファースト」シリーズのようなOOPについていくつかの良い素材をお読みくださいかよりインタラクティブなものを好むなら、Udemyの素晴らしいコースやチュートリアルがあります。

+0

"for i in self.food_list"を行う方が簡単ではないでしょうか? –

+0

@Leonhard Triendl - >絶対に、わかりやすくするためにコードをほとんど変更しないようにしたかった) –

+0

私のコードでクラスコンストラクタにself.food_list = [] – OysterD3

1

food_listの要素を繰り返し処理します。サー・ロビンの答えに改良として :

class Food: 
    food_list = [] 

    def totalCalorie(self): 
     j=0 
     for i in self.food_list: 
      j += i[3] 
     print("Total calorie of all food is {}Kcal".format(j)) 

    def addFood(self,newfruit): 
     self.food_list.append(newfruit) 


f = Food() 
f.addFood(['banana', 100, 'Fruit', 100.0]) 
f.addFood(['orange', 100, 'Fruit', 384.0]) 
f.totalCalorie() 

それは2つの以上の元素でも動作するように私は、あまりにも​​一部を編集しました。

+0

リスト内の要素がユーザーによって入力された場合はどうなりますか?ユーザーがaddFoodメソッドを呼び出すと、リストに追加されます。私はそれを作ることができませんfood_list =コンストラクタではなし。それは私に別のエラーを引き起こすでしょう。 – OysterD3

+0

私は自分の答えを編集しましたので、好きなだけ多くの食品を追加できます –

+0

あなたの答えは私を大きく助けています。私のエラーは他のクラスにあることがわかりました。私はすでに更新しました。確認してください。前もって感謝します! – OysterD3

関連する問題