18
votes

I'm using Python's max function to find the largest integer in a dictionary called count, and the corresponding key (not quite sure if I'm saying it properly; my code probably explains itself better than I'm explaining it). The dictionary count is along the lines of {'a': 100, 'b': 210}, and so on.

number = count[max(count.items(), key=operator.itemgetter(1))[0]]
highest = max(count, key=count.get)

What would I do if there were two equal largest values in there? If I had {'a': 120, 'b': 120, 'c': 100}, this would only find the first of a and b, not both.

6
What you do seems overly complex. Fox example: number = max(count.values()). - Lev Levitsky
I can't resist one-liners for these kinds of questions highest, number = reduce(lambda a, b:a[0].append(b[0]) or (a[0], b[1]) if b[1] == a[1] else (([b[0]], b[1]) if b[1] > a[1] else a), count.iteritems(), ([], -1)) - Michael Mior

6 Answers

32
votes

Idea is to find max value and get all keys corresponding to that value:

count = {'a': 120, 'b': 120, 'c': 100}

highest = max(count.values())

print([k for k, v in count.items() if v == highest])
2
votes

Same idea as Asterisk, but without iterating over the list twice. Bit more verbose.

count = { 'a': 120, 'b': 120, 'c': 100 }
answers = []
highest = -1

def f(x):
    global highest, answers
    if count[x] > highest:
        highest = count[x]
        answers = [x]
    elif count[x] == highest:
        answers.append(x)

map(f, count.keys())
print answers
1
votes

Fast single pass:

a = { 'a': 120, 'b': 120, 'c': 100 }
z = [0]
while a:
    key, value = a.popitem()
    if value > z[0]:
        z = [value,[key]]
    elif value == z[0]:
        z[1].append(key)

print z
#output:
[120, ['a', 'b']]

And an amusing way with defaultdict:

import collections
b = collections.defaultdict(list)
for key, value in a.iteritems():
    b[value].append(key)
print max(b.items())
#output:
(120, ['a', 'b'])
0
votes

This could be a way (probably not the most efficient).

value = max(count.values())
filter(lambda key: count[key]==value,count)
0
votes

Sometimes simplest solution may be the best:

max_value = 0
max_keys = []

for k, v in count.items():
    if v >= max_value:
        if v > max_value:
            max_value = v
            max_keys = [k]
        else:
            max_keys.append(k)

print max_keys

The code above is slightly faster than two pass solution like:

highest = max(count.values())
print [k for k,v in count.items() if v == highest]

Of course it's longer, but on the other hand it's very clear and easy to read.

-1
votes

To print a list without bucket. use :

' '.join(map(str, mylist))

or, more verbosely:

' '.join(str(x) for x in mylist)