2015-02-04 4 views
1

각 이름 (키)에 대한 평균 점수 (값)를 얻으려고했지만 불행히도 파이썬에 익숙하지 않아 코드 내에서 avg 함수를 성공적으로 구현할 수 없었습니다. 나는 같은 multipile 값이 각 키에 대한 평균을 계산 :키에 대해 여러 값의 평균을 찾는 방법은 무엇입니까?

Rob: 3,5,2,7 
Matt: 9,2,3,4 
Dan: 5,6,3,1 

또한 내가 가장 높은 순위부터 가장 낮은 순위로, 평균 점수의 순서로 키를 인쇄 할 수 얼마나 계산 후. 계산 된 평균을 목록에 입력해야합니까 아니면 다른 방식입니까?

이 지금까지 내 코드입니다 : sumlen 목록에서 평균 찾을 수

with open('score_file.txt') as infile: 
    for line in infile: 
     name_field, scores = line.split(':') 
     name = name_field.split()[0]   
     scores = [int(score.strip()) for score in scores.split(',')] 


    score_dict[name] = scores 
    score_dict.setdefault(name, []).extend(scores) 


for name in sorted(score_dict.keys()): 
    print("{} Scored: {}".format(name, avg(score_dict[name]))) 
+3

* * 사용자의 시도한'avg' 함수는? 표시 한 코드는 부적절합니다. 일반적으로 평균을 계산하는 방법을 알고 있습니까? – jonrsharpe

+1

'score_dict [name] = ...'행은'for' 루프 안에 있어야합니다. 이미 시작 값을 dict에 지정하고 있기 때문에 setdefault 라인은 필요하지 않습니다. – jsbueno

답변

0

사용. 예 :

>>> def avg(scores): 
...  return sum(scores)/float(len(scores)) 
... 
>>> 
>>> l = [1,2,3,4] 
>>> avg(l) 
2.5 
>>> l = [4, 8] 
>>> avg(l) 
6.0 
>>> 

코드 :

def avg(scores): 
    return sum(scores)/float(len(scores)) 


def getStudentScores(filepath): 
    score_dict = {} 
    with open(filepath) as infile: 
     for line in infile: 
      name, scores = line.split(':') 
      #scores = [int(score.strip()) for score in scores.split(',')] 
      scores = map(int, scores.split(",")) 

      score_dict[name.strip()] = (scores, avg(scores)) 

    return score_dict 

def displayStudentScores(score_dict): 
    for name in sorted(score_dict): 
     print("Name: {} ,Scored: {}, Avg: {}".format(name, score_dict[name][0], score_dict[name][1])) 

filepath = "/home/vivek/Desktop/input1.txt" 
score_dict = getStudentScores(filepath) 
displayStudentScores(score_dict) 

출력 : -

:~$ python workspace/vivek/study/test.py 
Name: Dan ,Scored: [5, 6, 3, 1], Avg: 3.75 
Name: Matt ,Scored: [9, 2, 3, 4], Avg: 4.5 
Name: Rob ,Scored: [3, 5, 2, 7], Avg: 4.25 
1

python3.4를 사용하면 사용할 수 있습니다 statistics.mean :

from statistics import mean 
for name,val in sorted(score_dict.items(),key=lambda x:mean(x[1])): 
    print("{} Scored: {}".format(name, mean(val)) 


Dan Scored: 3.75 
Rob Scored: 4.25 
Matt Scored: 4.5 

score_dict.setdefault(name, []).extend(scores)도 제거 할 수 있습니다. score_dict[name] = scores은 이미 이름과 모든 점수 목록의 키/값 쌍을 만듭니다. 이름이 반복되는 경우 setdefault를 먼저 사용하거나 defaultdict를 사용해야합니다.

sorted(score_dict.keys())을 사용하면 불필요하며 sorted(score_dict)을 사용하는 것이 효율적이지 않습니다.

또는 한 번만 평균을 계산하고 분류의 열쇠로 itemgetter 사용 : 음

from statistics import mean 
from operator import itemgetter 
srted_mean = ((k, mean(v)) for k, v in score_dict.items()) 
for name,mn in sorted(srted_mean,key=itemgetter(1)): 
    print("{} Scored: {}".format(name, mn)) 
0
def avg_score(marks): 
    return float(sum(marks))/len(marks) 

players = score_dict.items() 
players.sort(key = lambda player: avg_score(player[1]), reverse=True) 
for name, marks in players: 
    print("{} Scored: {}".format(name, avg_score(marks))) 
0

간단한 해결책이 될 수 sumlen를 사용하여 (난 당신이 제대로 파일에서 값을 가져 같은데 사전을 구할 수 있습니다.) -

lables = {'Rob':[3,5,2,7], 'Matt':[9,2,3,4], 'Dan':[5,6,3,1]} 
avg_list = [(key, float(sum(l))/len(l)) for key, l in lables.items()] 
print avg_list #[('Rob', 4.25), ('Dan', 3.75), ('Matt', 4.5)] 
avg_list_sorted = sorted(avg_list, key = lambda avg_tuple: avg_tuple[1], reverse=True) 
print avg_list_sorted #[('Matt', 4.5), ('Rob', 4.25), ('Dan', 3.75)] 
print [avg_tuple[0] for avg_tuple in avg_list_sorted] #['Matt', 'Rob', 'Dan'] 
관련 문제