Python:使用Value作为字典获取前n个关键字

时间:2016-07-06 07:33:26

标签: python dictionary

我有一本字典:

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

注意:应该是排名第一的玩家,例如我需要前两名但是可以在后期更改。

4 个答案:

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

您的链接是对的。您必须对其进行修改才能将其用于您的案例。

方法是:

  1. 降序排序
  2. 先获得
  3. 您可以使用库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方法的keysorted参数轻松完成此操作。有关更多清晰度,请参阅此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]))