【问题标题】:python sort dictionary items by value and then keypython按值排序字典项然后键
【发布时间】:2015-12-08 13:13:01
【问题描述】:

全部,

我在按值排序字典然后打印时遇到了困难。

我的对象(数据集)如下所示...

dict_items([(0, {'studentName': 'dan', 'Score': 80.0}), (1, {'studentName': 'rob', 'Score': 92.0})])

我想按分数排序并打印,但我失败得很惨。如果有帮助,我按照建议使用以下方法按 StudentName 排序。

entries = sorted([(dataSet[entry]['studentName'], dataSet[entry]['Score']) for entry in dataSet])
  for name, score in entries:
    print(('Student: {} -- Score: {}%'.format(name, score)))

【问题讨论】:

  • 能看到dataSet的内容吗?
  • 按分数排序,然后按名称排序可能行不通,除非您有可以对名称进行排序的分数范围。
  • @AyushShanker 进行了编辑以使其更加明显。
  • @SirParselot 考虑到这一点,我很高兴只需按分数排序。 Python不是我的领域,乞丐不能选择!
  • 不可能对字典进行排序,只能得到已排序字典的表示。字典本质上是无序的,但其他类型,例如列表和元组,则不是。所以你需要一个排序的表示,它是一个列表——可能是一个元组列表。

标签: python sorting dictionary items


【解决方案1】:
MyDict = {0: {'Score': 80.0, 'studentName': 'dan'},
          1: {'Score': 92.0, 'studentName': 'rob'},
          2: {'Score': 10.0, 'StudentName': 'xyz'}}

这将返回字典中的键值对列表,按值从高到低排序:

sorted(MyDict.items(), key=lambda x: x[1], reverse=True)

对于按键排序的字典,使用如下:

sorted(MyDict.items(), reverse=True)

返回的是一个元组列表,因为字典本身无法排序。

这既可以打印出来,也可以发送到进一步的计算中。

【讨论】:

    【解决方案2】:

    假设您的对象是tuplesdictslist(我可以通过给定的数据得出的最接近的解释),这就足够了:

    >>> dict_items = [(0, {'Score': 80.0, 'studentName': 'dan'}), (1, {'Score': 92.0, 'studentName': 'rob'
    })]
    >>> sorted(dict_items, key=lambda x: x[1]['Score'])
    # [(0, {'Score': 80.0, 'studentName': 'dan'}), (1, {'Score': 92.0, 'studentName': 'rob'
    })]
    

    【讨论】:

      【解决方案3】:

      下面是另一种方法,也许有人需要:

      d = {0: {'Score': 80.0, 'studentName': 'dan'},
           1: {'Score': 92.0, 'studentName': 'rob'},
           2: {'Score': 10.0, 'StudentName': 'xyz'}}
      
      sorted(d, cmp = lambda a,b: cmp(d[a]['Score'],d[b]['Score']))
      

      【讨论】:

        【解决方案4】:

        如果您只需要按分数值排序的键列表:

        d = {0: {'Score': 80.0, 'studentName': 'dan'},
             1: {'Score': 92.0, 'studentName': 'rob'},
             2: {'Score': 10.0, 'studentName': 'xyz'}}
        
        sorted(d, key=lambda k: d[k]['Score'])
        

        生产

        [2, 0, 1]
        

        否则,您可以使用有序字典

        from collections import OrderedDict
        od = OrderedDict(sorted(d.items(), key=lambda i: i[1]['Score']))
        

        给你

        OrderedDict([(0, {'Score': 80.0, 'studentName': 'dan'}), (1, {'Score': 92.0, 'studentName': 'rob'})])
        

        你可以很好地打印出来

        for v in od.values():
            print(v['Score'], v['studentName'])
        
        10.0 xyz
        80.0 dan
        92.0 rob
        

        【讨论】:

        • 这能满足您的需要吗?
        【解决方案5】:

        我只会使用:

         def comp(x,y):
            if x[1]['Score'] != y[1]['Score']:
                return 1 if x[1]['Score'] > y[1]['Score'] else -1
            elif x[1]['studentName'] < y[1]['studentName']:
                return -1
            elif x[1]['studentName'] > y[1]['studentName']:
                return 1
            else:
                return 0
        

        然后

        sorted(dict_items, comp)
        

        例如对于

        dict_items = [(0, {'Score': 80.0, 'studentName': 'dan'}),
                      (1, {'Score': 92.0, 'studentName': 'rob'}),
                      (2, {'Score': 70.0, 'studentName': 'foo'})]
        

        它给出:

        [(2, {'Score': 70.0, 'studentName': 'foo'}), (0, {'Score': 80.0, 'studentName': 'dan'}),
         (1, {'Score': 92.0, 'studentName': 'rob'})]
        

        当心:您的问题标题是关于字典项的。答案与问题中的代码一致,但仅对元组列表进行排序。如果你真的有一个字典d,你应该使用sorted(d.items())

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-18
          • 2011-12-06
          • 1970-01-01
          • 2012-04-12
          • 1970-01-01
          相关资源
          最近更新 更多