2017-02-25 10 views
-3

私はpythonでプログラムを書いています。これは、各レベルで最高得点のプレーヤーを返すはずですが、69行目の "KeyError:20"(P_L1 = players_TS [ H_L1])、これを修正する方法を考えることができません。
月、3,15
StarPlayer、2,18
エリー、5,9
など
ここでは私です:私のコードでは、私はこのようにフォーマットされた「playerScores.txt」と呼ばれるテキストファイルを開きますコード:
私のpythonプログラムは "KeyError:20"を返し続けます。

print("The highest scorers for each leve are:\n") 
    PS3=open("PlayerScores.txt","r").read().split("\n") 
    level1_scores=[] 
    players_TS={} 
    level2_scores=[] 
    players_T2={} 
    level3_scores=[] 
    players_T3={} 
    level4_scores=[] 
    players_T4={} 
    level5_scores=[] 
    players_T5={} 

    for line in PS3: 
     lines=line.split(",") 
     player=lines[0] 
     level=lines[1] 
     score=lines[2] 

     erros=open("scoreboard_errorlog.text","w") 

     if int(score)>20: 
      errors.write(score) 
     if int(level)>5: 
      errors.write(level) 

     if int(level)==1: 
      level1_scores.append(int(score)) 
      players_TS.setdefault(score,[]).append(player) 
     if int(level)==2: 
      level2_scores.append(int(score)) 
      players_T2.setdefault(score,[]).append(player) 
     if int(level)==3: 
      level3_scores.append(int(score)) 
      players_T3.setdefault(score,[]).append(player) 
     if int(level)==4: 
      level4_scores.append(int(score)) 
      players_T4.setdefault(score,[]).append(player) 
     if int(level)==5: 
      level5_scores.append(int(score)) 
      players_T5.setdefault(score,[]).append(player) 

    H_L1=max(level1_scores) 
    P_L1=players_TS[H_L1] 
    H_L2=max(level2_scores) 
    P_L2=players_T2[H_L2] 
    H_L3=max(level3_scores) 
    P_L3=players_T3[H_L3] 
    H_L4=max(level4_scores) 
    P_L4=players_T4[H_L4] 
    H_L5=max(level5_scores) 
    P_L5=players_T5[H_L5] 

    print("Level\tPlayer name\tScore\nLevel 1\t",P_L1,"\t",H_L1,"\nLevel 2\t",P_L2,"\t",H_L2,"\nLevel 3\t",P_L3,"\t",H_L3,"\nLevel 4\t",P_L4,"\t",H_L4,"\nLevel 5\t",P_L5,"\t",H_L5) 

ヘルプははるかに高く評価されます。

+0

エラーの発生場所を特定することから始めます。 –

+0

'erros = open(..'と 'errors.write(...'はtypoです。) –

+0

@ScottHunter指定するのを忘れて申し訳ありません - 69行目(P_L1 = players_TS [H_L1]) –

答えて

2

問題はここに起こる:

if int(level)==1: 
    level1_scores.append(int(score)) 
    players_TS.setdefault(score,[]).append(player) 

score == "20"と仮定する。 の整数20level1_scoresを追加しますが、の文字列"20"をキーとしてplayers_TSに追加しています。あなたはこれらの行を取得するときに、

H_L1=max(level1_scores) 
P_L1=players_TS[H_L1] 

H_L1は整数値20ですが、players_TS内のすべてのキーは"20"のような文字列です。 20 != "20"以降、KeyErrorとなります。

多分、あなたは(そのことについて、およびlevelscoreを持ちたいので、ループの残りの部分であるとして、その後scoreを使用し、あなたはそれを解析一度直後にそれを変換し、全体の整数です。

for line in PS3: 
    lines = line.split(",") 
    player = lines[0] 
    level = int(lines[1]) 
    score = int(lines[2]) 

    with open("scoreboard_errorlog.text","w") as errors: 

     if score > 20: 
      errors.write(score) 
     if level > 5: 
      errors.write(level) 

    if level == 1: 
     level1_scores.append(score) 
     players_TS.setdefault(score,[]).append(player) 
    elif level == 2: 
     level2_scores.append(score) 
     players_T2.setdefault(score,[]).append(player) 
    elif level == 3: 
     level3_scores.append(score) 
     players_T3.setdefault(score,[]).append(player) 
    elif level == 4: 
     level4_scores.append(score) 
     players_T4.setdefault(score,[]).append(player) 
    elif level == 5: 
     level5_scores.append(score) 
     players_T5.setdefault(score,[]).append(player) 

    H_L1 = max(level1_scores) 
    P_L1 = players_TS[H_L1] 
    H_L2 = max(level2_scores) 
    P_L2 = players_T2[H_L2] 
    H_L3 = max(level3_scores) 
    P_L3 = players_T3[H_L3] 
    H_L4 = max(level4_scores) 
    P_L4 = players_T4[H_L4] 
    H_L5 = max(level5_scores) 
    P_L5 = players_T5[H_L5] 

しかし、あなたはまた、個別の変数の名前ではなく、この大量のデータを保存するためにdict Sを使用する必要があります。

level_scores = {level: [] for level in range(1,6)} 
players = {} 
for line in PS3: 
    lines = line.split(",") 
    player = lines[0] 
    level = int(lines[1]) 
    score = int(lines[2]) 

    # Use append mode, or you overwrite the file each time through the loop 
    with open("scoreboard_errorlog.text", "a") as errors: 

     if score > 20: 
      errors.write(score) 
     if level > 5: 
      errors.write(level) 
      continue 

    level_scores[level].append(score) 
    players[level].setdefault(score,[]).append(player) 


H = {} 
P = {} 
for level in range(1,6): 
    H[level] = max(level_scores[level]) 
    P[level] = players[level][H[level]] 
関連する問題