bob
bob

Reputation: 27

Find biggest value in a python dict

I have a python dict like below:

{    '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'},
}

How could I get the following result?

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

Upvotes: 2

Views: 161

Answers (5)

JRodDynamite
JRodDynamite

Reputation: 12623

Well, here is the code for it (just 5 lines):

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

Output:

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

-9.0 is just a random low number.

Upvotes: 2

Kenly
Kenly

Reputation: 26758

I iterate a second time in dict to compare values.

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

Upvotes: 0

user768518
user768518

Reputation: 114

A little late here.

#!/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)

Output:

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

Not exactly in the order you expected them, but the values are correct. It's not the most elegant solution, though.

Upvotes: 0

vks
vks

Reputation: 67988

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()]

You can use additional dict to do your job.

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

Upvotes: 0

graN
graN

Reputation: 34

I agree the question is a bit vague.. I recommend you dont use strings as values.. use int or float if you can in the dictionaries, also does not specify if python 2.x or 3.x

but I think you are after something like this..

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

this is how it behaves:

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)

Upvotes: 0

Related Questions