【问题标题】:How to sort keys in dictionary if values are same ?如果值相同,如何对字典中的键进行排序?
【发布时间】:2015-09-19 12:04:22
【问题描述】:

按分数对字典进行排序。如果分数相同,则按名称对其进行排序

import operator
dt={ 
'sudha'  : {'score' : 75} ,
'Amruta' : {'score' : 95} ,
'Ramesh' : {'score' : 56} ,
'Shashi' : {'score' : 78} ,
'Manoj'  : {'score' : 69} ,
'Resham'  : {'score' : 95} 
} 

sorted_x1 = sorted(dt.items(), key=operator.itemgetter(1))
print sorted_x1

输出是:

[('Ramesh', {'score': 56}), ('Manoj', {'score': 69}), 
 ('sudha', {'score':           75}), 
 ('Shashi', {'score': 78}),   ('Resham', {'score': 95}), ('Amruta',{'score': 95})]

现在我想按名称对最后两个元素进行排序,因为它的分数相同。

【问题讨论】:

  • key=operator.itemgetter(1, 0)
  • @AshwiniChaudhary,再看一遍。 itemgetter(1) 是一个糟糕的起点

标签: python python-2.7 sorting dictionary


【解决方案1】:

您可以将要排序的元素作为元组或列表发送,排序将首先在第一个元素上进行,如果第一个元素相同,它将移动到下一个元素。

例子-

>>> dt={
... 'sudha'  : {'score' : 75} ,
... 'Amruta' : {'score' : 95} ,
... 'Ramesh' : {'score' : 56} ,
... 'Shashi' : {'score' : 78} ,
... 'Manoj'  : {'score' : 69} ,
... 'Resham'  : {'score' : 95}
... }
>>>
>>> sorted_x1 = sorted(dt.items(), key=lambda x: (x[1]['score'], x[0]))
>>> sorted_x1
[('Ramesh', {'score': 56}), ('Manoj', {'score': 69}), ('sudha', {'score': 75}), ('Shashi', {'score': 78}), ('Amruta', {'score': 95}), ('Resham', {'score': 95})]

【讨论】:

    【解决方案2】:

    小心,您的代码实际上是在比较字典本身而不是分数。即

    {'score': 56} < {'score': 69}
    

    如果字典中有额外的键,可能会引起意外。您可以安排key 函数返回scorekeytuple

    sorted_x1 = sorted(dt.items(), key=lambda (k, v): (v['score'], k))
    

    如果有人需要在 Python3 中执行此操作,您将不得不避免在 lambda 中解包元组,因为不再允许这样做。

    sorted_x1 = sorted(dt.items(), key=lambda k_v: (k_v[1]['score'], k_v[0]))
    

    【讨论】:

      【解决方案3】:

      这是一种方法:

      k = sorted(dt, key=dt.__getitem__)
      v = sorted(dt.values())
      sorted_dt_scores = zip(k,v)
      

      打印时输出sorted_dt_scores:

      [('Ramesh', {'score': 56}), ('Manoj', {'score': 69}), ('sudha', {'score': 75}), ('Shashi', {'score': 78}), ('Resham', {'score': 95}), ('Amruta', {'score': 95})]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-06
        • 1970-01-01
        • 2019-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多