Python: возвращает максимальное значение dict его ключом - PullRequest
0 голосов
/ 31 марта 2011

У меня есть следующие указания:

counts = {('test1', 'alpha'): 2, 
          ('test2', 'beta'): 1, 
          ('test1', 'delta'): 1, 
          ('test2', 'gamma'): 2}

Как вернуть 'альфа / бета / гамма / дельта' каждого кортежа с максимальным значением?

т.е.

test1, alpha, 2 #, потому что test1 имеет 'alpha' в качестве наибольшего значения

test2, gamma, 2 #, потому что test2 имеет значение 'gamma' в качестве наибольшего значения

Будет ли это работать?

maxDict={}
for (eachtest,pattern), counter in counts.items():
    maxDict[eachtest,pattern] = max(maxDict.get(eachtest,0),counter)

Спасибо.

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

Во-первых, преобразуйте ваш dict, чтобы сопоставить названия тестов со списками (count, pattern) кортежей:

counts2 = collections.defaultdict(list)
for (test, pattern), c in counts.iteritems():
    counts2[test] += (c, pattern)

Теперь вы можете легко получить максимумы:

for test, patterns in counts2.iteritems():
    print test, max(patterns)
1 голос
/ 31 марта 2011

Ты почти прав.Вам необходимо индексировать словарь только с именами тестов и помнить как имя шаблона, так и его значение в качестве значений словаря.Использование max на мой взгляд немного излишне.Более простой код также работает и более читабелен:

maxDict = {}
for (eachtest, pattern), counter in counts.iteritems():
    _, prev_max = maxDict.get(eachtest, ('', 0))
    if counter > prev_max:
        maxDict[eachtest] = (pattern, counter)

print maxDict
# prints: {'test1': ('alpha', 2), 'test2': ('gamma', 2)}
...