Python: получение максимального из словаря {(tuple): value} для каждого имени поля в кортеже - PullRequest
2 голосов
/ 21 марта 2011

еще один вопрос из списка-словаря.

У меня есть подсказка с именами модулей и тестовыми именами в списке:

dictA = {('unit1', 'test1'): 10,  ('unit2', 'test1'): 78,  ('unit2', 'test2'): 2, ('unit1', 'test2'): 45}

units = ['unit1', 'unit2'] 
testnames = ['test1','test2']

Как нам найти максимум значений для каждогоtest in testnames:

Я пытался сделать следующее:

def max(dict, testnames_array):
    maxdict = {}
    maxlist = []
    temp = []
    for testname in testnames_array:
        for (xunit, xtestname), value in dict.items():
            if xtestname == testname:
                if not isinstance(value, str):
                    temp.append(value)
            temp = filter(None, temp)
            stats = corestats.Stats(temp) 
            k = stats.max() #finds the max of a list using another module
            maxdict[testname] = k
    maxlist.append(maxdict)
    maxlist.insert(0,{'Type':'MAX'})
    return maxlist

Проблема в том, что я получаю вывод:

[{'Type':'MAX'}, {'test1': xx}, {'test2':xx}]

, где xx все возвращаются как одинаковые значения!!

где моя вина?какие-нибудь более простые методы?пожалуйста посоветуй.Благодарю.

Ответы [ 2 ]

6 голосов
/ 21 марта 2011
>>> dictA = {('unit1', 'test1'): 10,  ('unit2', 'test1'): 78,  ('unit2', 'test2'): 2, ('unit1', 'test2'): 45}
>>> maxDict={}
>>> for (unitName,testName),grade in dictA.items():
    maxDict[testName]=max(maxDict.get(testName,0),grade)


>>> maxDict
{'test1': 78, 'test2': 45}

Я думаю, это должно решить.

0 голосов
/ 21 марта 2011
dictA = {('unit1', 'test1'): 10,  ('unit2', 'test1'): 78,  ('unit2', 'test2'): 2, ('unit1', 'test2'): 45}

def maxIndex(d, field=0):
    best = {}
    for k,v in d.iteritems():
        index = k[field]
        try:
            old_v = best[index]
            best[index] = max(v, old_v)
        except KeyError:
            best[index] = v
    return best

maxIndex(dictA, 0)  # -> {'unit1': 45, 'unit2': 78}
maxIndex(dictA, 1)  # -> {'test1': 78, 'test2': 45}
...