44

I have a dictionary that looks like this

MyCount= {u'10': 1, u'1': 2, u'3': 2, u'2': 2, u'5': 2, u'4': 2, u'7': 2, u'6': 2, u'9': 2, u'8': 2}

I need highest key which is 10 but i if try max(MyCount.keys()) it gives 9 as highest.
Same for max(MyCount).

The dictionary is created dynamically.

SilentGhost
  • 307,395
  • 66
  • 306
  • 293
Chris
  • 3,405
  • 4
  • 29
  • 34

7 Answers7

70

This is because u'9' > u'10', since they are strings.

To compare numerically, use int as a key.

max(MyCount, key=int)

(Calling .keys() is usually unnecessary)

kennytm
  • 510,854
  • 105
  • 1,084
  • 1,005
20

You need to compare the actual numerical values. Currently you're comparing the strings lexigraphically.

max(MyCount, key=int)
Mike Graham
  • 73,987
  • 14
  • 101
  • 130
2
max(map(int, MyCount))

Or if you want the return value to be the original string:

max(MyCount, key=int)
Matthew Flaschen
  • 278,309
  • 50
  • 514
  • 539
2

In case anybody ended up here looking for how to sort by value instead of the key:

max(MyCount, key=MyCount.get)
typhon04
  • 2,350
  • 25
  • 22
1

Since your keys are strings, they are compared lexicographically and '9' is the max value indeed.

What you are looking for is something like:max(int(k) for k in MyCount)

1

This is your problem:

>>> u'10' > u'9'
False

Effectively, you're comparing the characters '1' and '9' here. What you want is probably this:

max(long(k) for k in MyCount)

or create the dictionary with numbers as keys (instead of strings).

AndiDog
  • 68,631
  • 21
  • 159
  • 205
1

You use max for string values. You must convert them to int. Try something like:

print(max([int(s) for s in MyCount.keys()]))

Or as Tim suggested:

print(max(int(s) for s in MyCount))
Michał Niklas
  • 53,067
  • 18
  • 70
  • 114