Michael Kročka
Michael Kročka

Reputation: 665

Fastest way to get key with most items in a dictionary?

I am trying to find the fastest way to get the dictionary key with the most items. The two methods I have tried so far are:

def get_key_with_most_items(d):
  maxcount = max(len(v) for v in d.values())
  return [k for k, v in d.items() if len(v) == maxcount][0]

and

def sort_by_values_len(dict):
  dict_len = {key: len(value) for key, value in dict.items()}
  import operator
  sorted_key_list = sorted(dict_len.items(), key=operator.itemgetter(1), reverse=True)
  sorted_dict = [{item[0]: dict[item [0]]} for item in sorted_key_list]
  return sorted_dict

The first method return the key with the biggest number of items, while the second returns the whole dictionary as a list. In my case I only need the key, just to be clear. After comparing these methods in this manner:

start_time = time.time()
for i in range(1000000):
  get_key_with_most_items(my_dict) # sort_by_values_len(my_dict)
print("Time", (time.time() - start_time))

I have come to the conclusion that the get_key_with_most_items method is faster by almost 50%, with times 15.68s and 8.06s respectively. Could anyone recommend (if possible) something even faster?

Upvotes: 0

Views: 805

Answers (3)

Peter White
Peter White

Reputation: 338

for the max function:

max(d, key=lambda k: len(d[k]))

If you want the dict to be ordered, then use OrderedDict. I think technically your code will still work with regular dict, but that's a technicality based on the current implementation of Pythons dict - In the past regular dict would not have reliable order, and in the future it may not.

You could do this for example as a one liner to turn your dict into an ordered dict by value length:

from collections import OrderedDict

ordered_dict = OrderedDict(sorted(d.items(), key=lambda t: len(t[1])))

Upvotes: 0

Barmar
Barmar

Reputation: 782498

Use d.items() to get a sequence of the keys and values. Then get the max of this from the length of the values.

def get_key_with_most_items(d):
    maxitem = max(d.items(), key = lambda item: len(item[1]))
    return maxitem[0]

Upvotes: 0

Marat
Marat

Reputation: 15738

The solution is extremely simple:

max(d, key=lambda x: len(d[x]))

Explanation:

  • dictionaries, when iterated, are just a set of keys. max(some_dictionary) will take maximum of keys
  • max optionally accepts a comparison function (key). To compare dictionary keys by the amount of items, the built-in len does just the job.

Upvotes: 2

Related Questions