2017-12-26 5 views
0

私はPythonには新しく、私はCodecademyのコーディング演習を拡張しようとしていました。私はプログラムが選択された学生の平均のためのユーザー入力を取るようにしたいが、私は '文字列インデックスは整数でなければならない'エラーを取得し続けます。なぜ文字列インデックスは整数でなければならないのですか?

lloyd = { 
    "name": "Lloyd", 
    "homework": [90.0, 97.0, 75.0, 92.0], 
    "quizzes": [88.0, 40.0, 94.0], 
    "tests": [75.0, 90.0] 
} 
alice = { 
    "name": "Alice", 
    "homework": [100.0, 92.0, 98.0, 100.0], 
    "quizzes": [82.0, 83.0, 91.0], 
    "tests": [89.0, 97.0] 
} 
tyler = { 
    "name": "Tyler", 
    "homework": [0.0, 87.0, 75.0, 22.0], 
    "quizzes": [0.0, 75.0, 78.0], 
    "tests": [100.0, 100.0] 
} 

def average(numbers): 
    total = sum(numbers) 
    total = float(total)/len(numbers) 
    return total 

#List of Students to choose from for get_average input() 
x = '1. Alice' 
y = '2. Tyler' 
z = '3. Lloyd' 
#get_average function 
def get_average(alice): 
    homework = average(alice['homework']) 
    quizzes = average(alice['quizzes']) 
    tests = average(alice['tests']) 
    student = input('Please type the number of the student who\'s weighted average you would like to see:' + '\n' + x + '\n' + y + '\n' + z) 
    if student == '1': 
     print(0.1 * average(alice['homework']) + 0.3 * average(alice['quizzes']) + 0.6 * average(alice['tests'])) 

get_average('student') 

私はロイドのための関数を作成するには、アリスの平均とタイラーの平均のためのコードを使用するつもりだったが、私はちょうど最初の部分を把握することはできません。誰か助けてくれますか?ありがとう。

+0

' 'student''は、このように' alice'が文字列で、文字列です。一言ではありません。 'get_average(タイラー)'を試してください。 –

+3

生徒1人につき1つの辞書を作成しないでください。生徒名をキーにした生徒を作成します。 –

+0

@ Jean-FrançoisFabreまたは辞書付きの配列(リスト)。 –

答えて

0

いくつかの変更を加えました。まず、辞書を使って配列内にデータを置くことができます。名前は、キー名の下の配列データ内にあります。

標準ライブラリの2つの関数を使用します。 textwrapからテキストを正しくフォーマットし、統計を平均して平均を計算すること。

data = [{ 
    "name": "Lloyd", 
    "homework": [90.0, 97.0, 75.0, 92.0], 
    "quizzes": [88.0, 40.0, 94.0], 
    "tests": [75.0, 90.0] 
    }, 
    { 
    "name": "Alice", 
    "homework": [100.0, 92.0, 98.0, 100.0], 
    "quizzes": [82.0, 83.0, 91.0], 
    "tests": [89.0, 97.0] 
    }, 
    { 
    "name": "Tyler", 
    "homework": [0.0, 87.0, 75.0, 22.0], 
    "quizzes": [0.0, 75.0, 78.0], 
    "tests": [100.0, 100.0] 
}] 

そして

from textwrap import dedent 
from statistics import mean 

def return_average(d): 
    return 0.1 * mean(d['homework']) + 0.3 * mean(d['quizzes']) + 0.6 * mean(d['tests']) 

def get_average(ar): 
    # Create a list with all names 
    # The whitespace will be removed with dedent 
    namestring = '\n'.join(['   {}. {}'.format(idx, i['name']) 
          for idx,i in enumerate(ar,1)]) 
    # Ask for a valid input 
    while True: 
     student = input(dedent('''\ 
      Please type the number of the student who's\ 
      weighted average you would like to see:\n{}\n'''.format(namestring))) 

     if student in map(str,range(1,len(ar))): 
      break 
     else: 
      print("Not valid input") 

    # Send the valid input to return_average function 
    print(return_average(data[int(student)])) 

get_average(data) 
関連する問題