我有以下字典:
'{0: 0, 1: 11, 2: 26, 3: 43, 4: 14, 5: 29, 6: 34, 7: 49, 8: 49, 9: 108, 10: 124, 11: 108, 12: 361, 13: 290, 14: 2118, 15: 5408, 16: 43473, 17: 109462, 18: 111490, 19: 244675, 20: 115878, 21: 6960}'
为此字典,我想编写一个函数,该函数返回具有最高值的三个键值对(因此,在本例中为键18、19、20)。
我提出了以下建议:
cachedict = nr_of_objects_per_century() #Dictionary mentioned above
def top_3_centuries():
max_nr_works_list = sorted(cachedict.values())
top_3_values = []
for i in range(len(max_nr_works_list)-3, len(max_nr_works_list)):
top_3_values.append(max_nr_works_list[i])
print(top_3_values)
这给了我想要查找的最大值列表。但是我如何从这里开始?有没有一种方法可以不进行反向查找(对于字典来说这比较慢,对吗?),我觉得我可以更高效/ Python地完成此任务。
答案 0 :(得分:6)
您还可以将collections.Counter
与most_common
(内部使用堆队列)一起使用:
from collections import Counter
dct = {0: 0, 1: 11, 2: 26, 3: 43, 4: 14, 5: 29, 6: 34, 7: 49, 8: 49,
9: 108, 10: 124, 11: 108, 12: 361, 13: 290, 14: 2118, 15: 5408,
16: 43473, 17: 109462, 18: 111490, 19: 244675, 20: 115878, 21: 6960}
count = Counter(dct)
print(count.most_common(3)) # [(19, 244675), (20, 115878), (18, 111490)]
答案 1 :(得分:6)
heapq.nlargest
您可以通过使用堆队列来避免在此处进行完整排序:
from heapq import nlargest
from operator import itemgetter
dct = {0: 0, 1: 11, 2: 26, 3: 43, 4: 14, 5: 29, 6: 34, 7: 49, 8: 49,
9: 108, 10: 124, 11: 108, 12: 361, 13: 290, 14: 2118, 15: 5408,
16: 43473, 17: 109462, 18: 111490, 19: 244675, 20: 115878, 21: 6960}
res = nlargest(3, dct.items(), key=itemgetter(1))
print(res)
# [(19, 244675), (20, 115878), (18, 111490)]
答案 2 :(得分:3)
您可以使用此:
a = {0: 0, 1: 11, 2: 26, 3: 43, 4: 14, 5: 29, 6: 34, 7: 49, 8: 49,
9: 108, 10: 124, 11: 108, 12: 361, 13: 290, 14: 2118, 15: 5408,
16: 43473, 17: 109462, 18: 111490, 19: 244675, 20: 115878, 21: 6960}
l = sorted(list(a.items()), key=lambda tup: tup[1], reverse=True)[:3]
print(l) # [(19, 244675), (20, 115878), (18, 111490)]
它将字典a
转换为元组列表,按tup[1]
排序,将其反转并获得前3个匹配。
答案 3 :(得分:2)
您可以这样做:
dct = {0: 0, 1: 11, 2: 26, 3: 43, 4: 14, 5: 29, 6: 34, 7: 49, 8: 49, 9: 108, 10: 124, 11: 108, 12: 361, 13: 290, 14: 2118, 15: 5408, 16: 43473, 17: 109462, 18: 111490, 19: 244675, 20: 115878, 21: 6960}
res = [next(k for k in dct if dct[k]==v) for v in sorted(dct.values(), reverse=True)[:3]]
print(res) # -> [19, 20, 18]
崩溃:
sorted(dct.values(), reverse=True)[:3]
::接受3个最大词典值。next(k for k in dct if dct[k]==v)
::返回字典键,其值是上述3个值之一(迭代)。答案 4 :(得分:2)
只需两个简单的步骤:
aux = sorted([(v,k) for (k,v) in dic.items()])
res = [(v,k) for (k,v) in aux[-3:]]
#[(18, 111490), (20, 115878), (19, 244675)]
在此示例中比nlargest
和Counter.most_common
快。
答案 5 :(得分:2)
这将返回您想要的内容:
d = {0: 0, 1: 11, 2: 26, 3: 43, 4: 14, 5: 29, 6: 34, 7: 49, 8: 49, 9: 108, 10: 124, 11: 108, 12: 361, 13: 290, 14: 2118, 15: 5408, 16: 43473, 17: 109462, 18: 111490, 19: 244675, 20: 115878, 21: 6960}
print(sorted([(i,j) for i, j in d.items() if j in (sorted(d.values())[-3:])])[-3:])
#[(18, 111490), (19, 244675), (20, 115878)]
答案 6 :(得分:1)
d = {0: 0, 1: 11, 2: 26, 3: 43, 4: 14, 5: 29, 6: 34, 7: 49, 8: 49, 9: 108, 10: 124, 11: 108, 12: 361, 13: 290, 14: 2118, 15: 5408, 16: 43473, 17: 109462, 18: 111490, 19: 244675, 20: 115878, 21: 6960}
d_items_sorted = sorted(d.items(), key=lambda x: x[1], reverse=True)
d_items_sorted[:3]
返回:
[(19, 244675), (20, 115878), (18, 111490)]
这是我能获得的最简单的代码,但是对字典的排序为O(nlogn),那么您应该可以在O(n)中进行同样的操作
答案 7 :(得分:0)
您是在寻找简单/算法简单的最有效方法还是最佳方法?
如果是后者,则应考虑将字典项按元组排序(可以使用cachedict.items()获得它们),如此答案https://stackoverflow.com/a/613218/10453363
只需按值对元组进行排序,然后获取最后3个元组(即键/值对)