假设我有一个字典。我想找到值最高的4个键。我想以一种非常基本的方式来实现这个目标。我的计算机科学知识并不那么高级。我只想遍历这个字典。或者应该怎么做呢?我意识到这并不是很具有挑战性。我不想使用heapq。我应该如何实现呢?
假设我有一个字典。我想找到值最高的4个键。我想以一种非常基本的方式来实现这个目标。我的计算机科学知识并不那么高级。我只想遍历这个字典。或者应该怎么做呢?我意识到这并不是很具有挑战性。我不想使用heapq。我应该如何实现呢?
我认为最符合Python风格的方式是:
sorted(d, key=d.get, reverse=True)[:4]
sorted(d, key=d.get)[-4:]
这样写会更短... - martineaud.get()
比 O(n)
解决方案效率低。为什么不直接迭代项目呢?collection.Counter.most_common
中使用的解决方案是 sorted(self.items(), key=itemgetter(1), reverse=True)
。 - JBernardomax_keys = sorted(d.keys(), key=d.get)[:-4]
或者你也可以反转 -- sorted(d.keys(), key=d.get, reverse=True)[:4]
。我的更大的观点是人们忘记了 list(dict) == d.keys()
,在这种情况下,我认为程序员应该倾向于更明确的选项。 - jwilnercollections.Counter
对象。c = collections.Counter(original_dict)
c.most_common(4)
[k for k, v in c.most_common(4)]
如需了解其实现方式,请查看此处的源代码。
Counter
来计数任何东西。尝试自己编写代码。这样做更加简洁。 - JBernardo按值排序,然后切片。 sorted
函数需要一个键函数。
items_by_value = sorted(d.items(), key=lambda (k, v): v)
keys = [k for k, v in items_by_value[-4:]]
好问题。
假设 d
是字典,如果您不关心键的顺序,您可以使用以下代码:
keys = [v[0] for v in sorted(d.items(), key=lambda v: v[1])[-4:]]
对于大型字典,最好使用以下方法以提高效率:
keys = [v[0] for v in sorted(d.items(), key=operator.itemgetter(1))[-4:]]
[-4:]
表示最后四个条目。在这两种情况下,如果您希望键按其相应的最高值的顺序排列,则请改用 [-1:-5:-1]
,这是最后四个输入的反向顺序。