在python dict中找到最大的价值

时间:2015-12-30 08:22:40

标签: python

我有一个如下所示的python dict:

{    '1': {'a': '0.6', 'b': '0.8', 'c': '2','d': '0.5'},
     '2': {'a': '0.7', 'b': '0.9', 'c': '0.1','d': '0.2'},
     '3': {'a': '0.5', 'b': '0.8', 'c': '3'},
}

我怎样才能得到以下结果?

('2','a','0.7') ('2',b','0.9') ('3','c', '3') ('1','d', '0.5')

5 个答案:

答案 0 :(得分:2)

嗯,这是代码(只有5行):

total = []
for i in ['a', 'b', 'c', 'd']:
    kv = max(a.iterkeys(), key=(lambda key: float(a[key][i]) if i in a[key].keys() else -9.0))
    hv = a[kv][i]
    total.append((kv, i, hv))

print total

输出:

[('2', 'a', '0.7'), ('2', 'b', '0.9'), ('3', 'c', '3'), ('1', 'd', '0.5')]

-9.0只是一个随机的低数字。

答案 1 :(得分:0)

我同意这个问题有点模糊..我建议你不要使用字符串作为值..如果你可以在字典中使用int或float,也不指定python 2.x或3.x

但我认为你是在追求这样的事情......

def filter_dict(values):
    result = collections.Counter()
    for value in values.keys():
        for k, v in values[value].items():
            v = float(v)
            result[k] = v if v > result[k] else result[k]
    return result

这就是它的表现:

class FilterDictTest(unittest.TestCase):
    def test_filter_dict(self):
        # Arrange
        actual = {
            '1': {'a': '0.6', 'b': '0.8', 'c': '2', 'd': '0.5'},
            '2': {'a': '0.7', 'b': '0.9', 'c': '0.1', 'd': '0.2'},
            '3': {'a': '0.5', 'b': '0.8', 'c': '3'}
        }
        expected = {
            'a': 0.7,
            'b': 0.9,
            'c': 3,
            'd': 0.5
        }

        # Act & Assert
        self.assertEquals(filter_dict(actual), expected)

答案 2 :(得分:0)

x={    '1': {'a': '0.6', 'b': '0.8', 'c': '2','d': '0.5'},
 '2': {'a': '0.7', 'b': '0.9', 'c': '0.1','d': '0.2'},
 '3': {'a': '0.5', 'b': '0.8', 'c': '3'},
}

d={}
for i,j in x.iteritems():
    for k,m in j.iteritems():
         d.setdefault(k,[0,0])
         if j[k]>d[k][0]:
            d[k]=(j[k],i)
print [(j[1],i,j[0]) for i,j in d.items()]

您可以使用其他dict来完成工作。

输出:[('2', 'a', '0.7'), ('3', 'c', '3'), ('2', 'b', '0.9'), ('1', 'd', '0.5')]

答案 3 :(得分:0)

有点晚了。

#!/usr/bin/env python3.5

# entry
entry =  {'1': {'a': '0.6', 'b': '0.8', 'c': '2','d': '0.5'}, '2': {'a': '0.7', 'b': '0.9', 'c': '0.1','d': '0.2'}, '3': {'a': '0.5', 'b': '0.8', 'c': '3'}}

# identify keys
all_categories = []

for number, dct in entry.items():
    for key, val in dct.items():
        all_categories = all_categories + list(dct.keys())

all_categories = set(all_categories)

# Get max values
max_values = {category:None for category in all_categories}

for category in all_categories:
    for number, dct in entry.items():
        if category in dct.keys():
            if max_values[category] is None:
                max_values[category] = (number, dct[category])
            elif float(max_values[category][1]) < float(dct[category]):
                max_values[category] = (number, dct[category])

output = [(number, category, value) for (category, (number, value)) in max_values.items()]

print (output)

输出:

[('2', 'a', '0.7'), ('1', 'd', '0.5'), ('2', 'b', '0.9'), ('3', 'c', '3')]

不完全符合您的预期顺序,但值正确。但它并不是最优雅的解决方案。

答案 4 :(得分:0)

我在dict中再次迭代以比较值。

values = []
for key in d:
    for skey in d[key]:
        max = 0
        _key_ = ''
        for _ in d:
            if d[_].has_key(skey):
                if d[_][skey]>max:
                    max = d[_][skey]
                    _key_ = _
        if (_key_, skey, max) not in values:
            values.append((_key_, skey, max))

print values