2016-04-15 46 views
-1

我已经计算出每个名称的平均分和最高分。然而。如果我有保存在一个文本文件中的以下值,这就是结果表明:(?即马特的平均水平的两倍,并遍历它)使用超过最后3个分数来分析数据;也重复分析?

matt 5 
matt 2 
matt 3 
andy 1 
andy 2 
andy 3 
andy 4 
matt 4 
matt 's average from the last 3 scores is 4.0 
andy 's average from the last 3 scores is 4.0 
matt 's average from the last 3 scores is 4.0 
andy -'s best score is 4 
matt -'s best score is 5 

这似乎是重复的第一个名字 此外,它是生产基于每个分数的数据,而不仅仅是最后3个?

user_scores = {} 
for line in reversed(open("Class1.txt").readlines()): 
    name, score = line.split() 
    score = int(score) 
+0

使用树方法来创建数据。可以使用'ast.literal_eval(line.strip())' – dsgdfg

+0

谢谢有更简单的方法吗? – Canadian1010101

+0

是否希望输出按名称或数字值(最高分/平均值)按字母顺序排序? –

回答

0

这是一个缩进错误。你要低于这个区块是第一缩进级别:

for name in sorted(user_scores): 
    # get the highest score in the list 
    average = sum(user_scores[name]) /float(len(user_scores[name])) 
    print(name, "'s average from the last 3 scores is", average) 

另外,还有一些在您的代码是写在一个糟糕的方式很多地方。这里有一个优化:

user_scores = {} 

# 'with' will automatically closes the file after leaving its code block: 
with open("Class1.txt") as scorefile: 

    for line in reversed(scorefile.readlines()): 
     name, score = line.split() 

     # nested if inside if/else is better than if-and plus if not: 
     if name in user_scores: 
      if len(user_scores[name]) < 3: 
       user_scores[name].append(int(score)) 
     else: 
      user_scores[name] = [int(score)] 

# If you want to sort by the numeric value, replace 'sorted(user_scores)' with 
# 'sorted(user_scores, key=lambda k: user_scores[k])': 
for name in sorted(user_scores): 
    # in Python 3 the '/' operator always returns the appropriate format. 
    # to get a pure integer division without decimal places, you would use '//'. 
    # Therefore no need for the float(...) conversion. 
    average = sum(user_scores[name])/len(user_scores[name]) 
    # str.format(...) is more flexible than just printing multiple items: 
    print("{}'s average from the last 3 scores is {}".format(name, average)) 

# No need to store another dictionary with best scores. 
# If you want to sort by the numeric value, replace 'sorted(user_scores)' with 
# 'sorted(user_scores, key=lambda k: user_scores[k])': 
for name in sorted(user_scores): 
    print("{}'s best score is {}".format(name, max(user_scores[name]))) 
+0

我第33行收到错误消息:在逆转(scorefile)线: 类型错误:参数逆转()必须是一个序列 – Canadian1010101

+0

@ Canadian1010101对不起,我错了。你需要readlines()。纠正了我的答案。 –

+0

我测试过它,它涵盖了所有的分数,而不仅仅是最后三个分数,所以平均分和最高分都是最后得分。 – Canadian1010101