2015-02-22 3 views
-3

Я пытаюсь заказать все оценки в порядке оценки каждого пользователя от наивысшего до самого низкого. Я попытался это с код ниже:Python DefaultDict Ordering Multiple Values ​​Issue

import collections 
from collections import defaultdict 
from operator import itemgetter 

worker_scores = collections.defaultdict(lambda: collections.deque(maxlen=3)) 
import operator 

worker_scores.clear() 

with open('score_names.txt') as f: 
    for line in f: 
     worker,score = line.split(":") 
     worker_scores[worker].append(int(score)) 

print("\nThis prints all the highest scores.\n") 

for worker in sorted(worker_scores, key=itemgetter(1,2,3), reverse=True): 
    print(worker," ".join(map(str,worker_scores[worker]))) 

    # This should print the maximum value for each key 
    print max(worker_scores, key=worker_scores.get) 

Мой текстовый файл также выглядит следующим образом:

AdamJohnson:10 
AdamJohnson:20 
AdamJohnson:30 
AdamJohnson:40 
AdamJohnson:60 
AdamJohnson:50 
MichaelJordan:70 
MichaelJordan:80 
MichaelJordan:100 
MichaelJordan:90 
DavidSnowman:15 
DavidSnowman:20 
DavidSnowman:30 
DavidSnowman:25 

Исход IDLE выглядит следующим образом:

This prints all the highest scores. 

MichaelJordan 80 100 90 
AdamJohnson 40 60 50 
DavidSnowman 20 30 25 

Это то, что Я хотел, где самые высокие оценки находятся на вершине, а самые низкие оценки - внизу. Я обнаружил метод itemgetter, чтобы сделать это, поэтому теперь я выполнил часть своего решения.

Для второй части я хочу, чтобы максимальная клавиша для каждого значения была напечатана. Я могу использовать отсортированный ключ для печати ключей в алфавитном порядке, но я не могу напечатать максимальное значение для каждой клавиши. Я использовал эту линию сверху:

print max(worker_scores, key=worker_scores.get) 

Чтобы получить этот результат:

AdamJohnson:60 
MichaelJordan:100 
DavidSnowman:30 

Но эта ошибка приходит: Invalid Syntax (Max). Что происходит не так?

+0

@jonrsharpe Посмотрите, сэр, я просто делаю этот код для моей собственной выгоды. Что подсказывает, что я делаю это для любой квалификации ??? Я извиняюсь, но чувствую себя оскорбленным. Я только смотрел на проекты других людей на SO, чтобы помочь разработать мою собственную программу с моим собственным пониманием. Пожалуйста, не предлагайте, чтобы я плагиатировал мою собственную работу, так как это подрывает мои собственные намерения. –

+0

@jonrsharpe Я не зарегистрирован в квалификации GCSE, поскольку я уже в колледже.Затем я удалю этот вопрос и спрошу новый. Извиняюсь за мою вспышку, так как вы тоже извинились, и я буду принимать ваши комментарии на борту. Благодарю. –

+0

@ DelbertJ.Nava Все, что вам нужно здесь, это отсортированная функция для сортировки ваших позиций словаря, а затем добавить в «OrderedDict», и о задании таких вопросов я видел, что многие люди, у которых есть репо более 100 тысяч, ответили на такие вопросы, а также ....! я не думаю, что у этих вопросов много проблем !! – Kasramvd

ответ

0

Вам не нужно использовать max, вы можете использовать функцию sorted и collections.OrderedDict:

d=OrderedDict() 

for k,v in sorted(((i,j.pop()) for i,j in worker_scores.items()),key=operator.itemgetter(1),reverse=True): 
    d[k]=v 

print d 
OrderedDict([('MichaelJordan', 100), ('DavidSnowman', 30), ('AdamJohnson', 60)]) 

Все, что я сделал в предыдущем коде является цикл по worker_scores элементов и поп последний элемент (макс) в deque, (j.pop()), но учтите, что вам нужно использовать reverse=True, чтобы получить заказ на желание, а затем добавить их в OrderedDict.

И для печати элементы:

for k,v in d.items(): 
    print ':'.join((k,str(v))) 

MichaelJordan:100 
DavidSnowman:30 
AdamJohnson:60 
+0

Спасибо! Я попытался распечатать ваш словарь как «MichaelJordan: 100',« AdamJohnson: 60' и «DavidSnowman: 30» на моем IDLE, используя следующее: 'для рабочего в отсортированном (d): print (worker," " .join (map (str, d [worker]))) 'но это приходит:' TypeError: 'int' объект не итерируется'. Как я могу решить эту проблему, чтобы напечатать желаемый результат выше? –

+0

@ DelbertJ.Nava добро пожаловать, ознакомьтесь с правлением! – Kasramvd

+0

Спасибо, сэр! @KasraAD Я извиняюсь за любые неудобства, которые я вызвал в своем коде. Возможно, мне придется снова спросить о SO, но, пожалуйста, поймите, что я не вхожу в какую-либо квалификацию, и я выражаю свои искренние сомнения в том, что любой ребенок сможет использовать такие сложные методы, включая defaultdict и массивы, для завершения их назначения на таких квалификационных уровнях. Спасибо :) –

1

Кроме того, если я хочу, чтобы распечатать мой словарь по порядку высоких результатов к низким результатам, я должен был бы использовать itemgetter(1), так как я смотрю на второе значение , который имеет наивысший балл, а затем использует свойство reverse, установленное на True, чтобы указать, что словарь должен быть напечатан с наивысшим наивысшим наивысшим и самым низким до самого нижнего.

см. Sort a Python dictionary by value если вы не понимаете. Я только что нашел этот ответ.

Еще раз спасибо @KasraAD и @AnttiHaapala, а также @ PM2ring за их поддержку и мои извинения за @jonrsharpe. Я теперь успешно ответил на свой вопрос!

Это код:

for k,v in sorted(d.items(), key=itemgetter(1), reverse=True): 
    print (':'.join((k,str(v)))) 
+0

Плюс за вашу похвальную попытку! – Kasramvd

+0

@ KasraAD могу я просто сказать спасибо за помощь в программе. Я только что закончил! Большое спасибо! –

+0

Добро пожаловать, чувак! – Kasramvd