获取字典中大多数项目的键的最快方法?

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

我正在尝试找到最快的方法来获取包含最多项目的字典键。目前我尝试过的两种方法是:

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]

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

第一种方法 return 具有最多项的键,而第二种方法 return 将整个字典作为列表。就我而言,为了清楚起见,我只需要钥匙。以这种方式比较这些方法后:

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

我得出的结论是 get_key_with_most_items 方法快了将近 50%,时间分别为 15.68 秒和 8.06 秒。谁能推荐(如果可能的话)更快的东西?

解决方法非常简单:

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

解释:

  • 字典在迭代时只是一组键。 max(some_dictionary) 将占用最多的键
  • max 可选择接受比较函数 (key)。要按项目数量比较字典键,内置 len 就可以完成工作。

使用d.items() 获取键和值的序列。然后从值的长度中得到最大值。

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

对于最大函数:

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

如果你想对字典进行排序,那么使用OrderedDict。我认为从技术上讲,您的代码仍然可以与常规字典一起使用,但这是基于 Python 字典的当前实现的技术问题 - 在过去,常规字典没有可靠的顺序,将来可能不会。

例如,您可以将此作为一个衬里来将您的字典变成按值长度排序的字典:

from collections import OrderedDict

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