我有一本字典:
data = {'sachin': {'score': 15000, 'out': 100},
'Dhoni': {'score': 8000, out: 80},
'Shewag': {'score': 12000, 'out': 150}}
我希望得到两名得分最高的球员。
所以我尝试过:key = (key for key,value in dd.items() if value['score'] > 'value').next()
在这里结束但没有成功。
尝试使用链接:top n keys with highest values in dictionary with tuples as keys
因为Python的新手无法绕过完美的解决方案。
有人可以分享一些想法!!!
输出如:
{'sachin':{'score':15000,'out':100},'Shewag':{'score':12000,'out':150}}
注意:应该是排名第一的玩家,例如我需要前两名但是可以在后期更改。
答案 0 :(得分:6)
排序工作:
m{regexp}
您对项目进行排序:
>>> dict(sorted(data.items(), key=lambda x: x[1]['score'], reverse=True)[:2])
{'Shewag': {'out': 150, 'score': 12000},
'sachin': {'out': 100, 'score': 15000}}
按姓名按字母顺序排序。
使用>>> sorted(data.items())
[('Dhoni', {'out': 80, 'score': 8000}),
('Shewag', {'out': 150, 'score': 12000}),
('sachin', {'out': 100, 'score': 15000})]
定义的key
函数按lambda
排序:
score
首先使用sorted(data.items(), key=lambda x: x[1]['score'])
[('Dhoni', {'out': 80, 'score': 8000}),
('Shewag', {'out': 150, 'score': 12000}),
('sachin', {'out': 100, 'score': 15000})]
获取最大的一个:
reverse
最后,只使用切片的两个第一项并将元组列表转换为sorted(data.items(), key=lambda x: x[1]['score'], reverse=True)
[('sachin', {'out': 100, 'score': 15000}),
('Shewag', {'out': 150, 'score': 12000}),
('Dhoni', {'out': 80, 'score': 8000})]
的字典:
dict
由于字典没有订单,您只知道您有两个得分最高的玩家。没有第一个或第二个概念。如果需要,您可以保留元组列表或转换为>>> dict(sorted(data.items(), key=lambda x: x[1]['score'], reverse=True)[:2])
{'Shewag': {'out': 150, 'score': 12000},
'sachin': {'out': 100, 'score': 15000}}
以保留顺序:
OrderedDict
为了使其更具可重用性,您可以编写一个函数:
>>> from collections import OrderedDict
>>> OrderedDict(sorted(data.items(), key=lambda x: x[1]['score'], reverse=True)[:2])
OrderedDict([('sachin', {'out': 100, 'score': 15000}),
('Shewag', {'out': 150, 'score': 12000})])
现在您可以将它与您的数据一起使用:
from collections import OrderedDict
def get_top_players(data, n=2, order=False):
"""Get top n players by score.
Returns a dictionary or an `OrderedDict` if `order` is true.
"""
top = sorted(data.items(), key=lambda x: x[1]['score'], reverse=True)[:n]
if order:
return OrderedDict(top)
return dict(top)
或设置不同数量的顶级玩家:
>>> get_top_players(data)
{'Shewag': {'out': 150, 'score': 12000},
'sachin': {'out': 100, 'score': 15000}}
或按顺序获取它们:
>>> get_top_players(data, n=3)
{'Dhoni': {'out': 80, 'score': 8000},
'Shewag': {'out': 150, 'score': 12000},
'sachin': {'out': 100, 'score': 15000}}
答案 1 :(得分:1)
您的链接是对的。您必须对其进行修改才能将其用于您的案例。
方法是:
您可以使用库heapq
>>> import heapq
>>> heapq.nlargest(2, data.keys(), key=lambda k: data[k]['score'])
['sachin', 'Shewag']
现在,您可以创建新的OrderedDict
来存储dict
import heapq
from collections import OderedDict
player_names = heapq.nlargest(2, data.keys(), key=lambda k: data[k]['score'])
ret = OrderedDict((x, data[x]) for x in player_names)
答案 2 :(得分:0)
是的,您可以通过lambda
方法的key
和sorted
参数轻松完成此操作。有关更多清晰度,请参阅此link
data = {'sachin':{'score':15000,'out':100},'Dhoni':{'score':8000,'out':80},'Shewag':{'score':12000,'out':150}}
print sorted(data.keys(), key = lambda x:data[x]["score"], reverse = True)
>>> ['sachin', 'Shewag', 'Dhoni']
要获得前2个结果,您可以尝试将切片列为lst[:2]
,以便在根据得分排序后获得前2个名称。
答案 3 :(得分:0)
你可以试试这个:
from collections import OrderedDict
from operator import getitem
data = {'sachin':{'score':15000,'out':100},'Dhoni':{'score':8000,'out':80},'Shewag':{'score':12000,'out':150}}
print(OrderedDict(sorted(data.items(), key = lambda x:getitem(x[1], "score"), reverse = True)[:2]))
输出:
OrderedDict([('sachin', {'score': 15000, 'out': 100}), ('Shewag', {'score': 12000, 'out': 150})])
如果你不需要总是订购字典,你可以这样做:
print(dict(sorted(data.items(), key = lambda x:getitem(x[1], "score"), reverse = True)[:2]))