2015-04-27 2 views
1

У меня есть некоторые данные, которые являются списком баллов для каждого из разных пользователей. Следующий код находит максимальное значение последних трех баллов для пользователя (сортированных, так что пользователь с минимальным счетом показан первый), и печать, что из:Сортировка списка для каждого пользователя по среднему значению 3-х записей

dlist = {c:max(d[c][-3:]) for c in d} #max for each user from last 3 
itmlist = sorted(dlist.items(), key=lambda x: x[1]) #sort items 
for z in itmlist: 
    print('{}: {} '.format(z[0], z[1])) #print user-by-user 

Я пытаюсь изменить это используйте sum(l)/len(l), чтобы найти среднее значение последних трех баллов для каждого пользователя, а затем отсортируйте его, чтобы напечатать минимальные пользовательские средние по порядку, но попали в тупик.

Может ли кто-нибудь указать мне правильное направление?

-

EDIT:

Это код, который используется для создания списка. Я использую текстовый файл, содержащий данные, содержащие результаты в формате, как:

Боб: 2
Иоанна: 7

Это то читать с помощью этого:

[Просмотр истории сообщение]

+1

Можете ли вы предоставить тест д и его ожидаемый результат? – igon

+1

Когда вы используете 'sum (l)/len (l)', он будет неявно возвращать 'int', который может потерять точность вычисления, любезно предоставите ввод образца, чтобы сделать проблему более ясной? Определить 'd' – ZdaR

+1

' sum (l)/len (l) 'должно быть одинаковым для всех элементов, как вы можете сортировать его? (или, другими словами, я думаю, я не понимаю, что вы здесь делаете) – alfasin

ответ

1

Вопрос немного неясен, поэтому я сделал некоторые предположения, скажите, если я где-то ошибаюсь?

d = {"bob":[1,2,3,4], "anmol":[5,4,3,2,1], "jhon":[3,2,1,8,7]} 

new_sorted_list = sorted(d.keys(), key=lambda x: sum(d[x][-3:])/3) 

print new_sorted_list 

>>> ['anmol', 'bob', 'jhon'] 

for record in new_sorted_list: 
    print record+" : "+str(sum(d[record][-3:])/3.0) 

>>> anmol : 2.0 
    bob : 3.0 
    jhon : 5.33333333333 
+0

Выглядит хорошо; OP также хочет видеть эти средние значения – smci

+0

Да, обновил ответ @smci – ZdaR

+0

... и я переработал заголовок, чтобы быть понятным, что здесь нужно – smci

-2

Если вы заботитесь только о среднем за последние три оценки:

dlist = {c:sum(d[c][-3:]) for c in d} #sum of last three scores for each user 
itmlist = sorted(dlist.items(), key=lambda x: x[1]) #sort items on score 
for z in itmlist: 
    print('{}: {} '.format(z[0], z[1]/3)) #print user-by-user 
+0

Из любопытства, что в этом плохого? – igon

0

A defaultdict, и statistics.mea деки п будет делать то, что вы хотите:

from collections import defaultdict, deque 
from statistics import mean 

# store maximum three scores using a defaultdict for repeated keys 
d = defaultdict(lambda: deque(maxlen=3)) 

for q in range(1, 4): 
    with open('Group{}.txt'.format(q), 'r') as f: 
     for record in f: 
      x, y = record.split(':') 
      d[x].append(int(y)) 

# sort by values 
srt = sorted(d.items(), key=lambda x: x[1]) 

# print name and mean from sorted list 
for name,scores in srt: 
    print('{}: {} '.format(name, mean(scores))) #print user-by-user 

Если вы хотите, значения должны быть установлены на среднем обновления Dict до сортировки:

for name, scores in d.items(): 
    d[name] = mean(scores) 


for name, mn in sorted(d.items(), key=lambda x: x[1]): 
    print('{}: {} '.format(name, mn)) 

Вам не нужно вычислить среднее значение для сортировки, как все ваши значения будут иметь длину 3, поэтому список с самым высоким итоговым счетом будет иметь самый высокий средний показатель.

+0

Нет комментариев от downvoter? –

0
>>> d = {'Bob':[2,4,4,5], 'John':[7,5,5,1]} 
>>> dlist = {c:max(d[c][-3:]) for c in d} 
>>> dlist2 = {user:sum(scores[-3:])/3 for user,scores in d.items()} 
>>> print(*(': '.join(map(str, [person, dlist2.get(person)])) for person in sorted(dlist2, key=dlist.get)), sep='\n') 
John: 3.6666666666666665 
Bob: 4.333333333333333 

 Смежные вопросы

  • Нет связанных вопросов^_^