【问题标题】:Sorting a dictionary by values if it occurs once otherwise by keys如果字典出现一次,则按值对字典进行排序,否则按键排序
【发布时间】:2019-05-27 11:03:38
【问题描述】:

我有这本字典,我需要按值对单词进行排序。但是当两个或多个单词具有相同的值时,我需要按字母对这些单词进行排序,但我不知道该怎么做。你能帮帮我吗?

dict = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7, 'green': 5, 'BLUE': 4,
        'violet': 2, 'GRAY': 3, 'White': 6}

提前谢谢你

【问题讨论】:

    标签: python python-3.x sorting dictionary ordereddictionary


    【解决方案1】:

    使用collections.OrderedDict,您可以构建一个有序映射,该映射仍然具有字典的优点,例如 O(1) 查找。

    from collections import OrderedDict
    
    d = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7,
         'green': 5, 'BLUE': 4, 'violet': 2, 'GRAY': 3, 'White': 6}
    
    od = OrderedDict(sorted(d.items(), key=lambda x: (x[1], x[0].casefold())))
    
    print(od)
    
    OrderedDict([('BLACK', 0), ('brown', 1), ('RED', 2), ('violet', 2), ('GRAY', 3),
                 ('BLUE', 4), ('orange', 4), ('green', 5), ('White', 6), ('YELLOW', 7)])
    

    由于您同时使用键和值进行排序,因此最好使用来自dict.items 的元组进行排序。此外,使用str.casefold 进行不区分大小写的排序。

    最后,永远不要隐藏诸如dict 之类的内置函数。使用dict_d 代替变量名。

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      >>> d = {'BLUE': 4, 'brown': 1, 'BLACK': 0, 'YELLOW': 7, 'violet': 2, 'orange': 4, 'green': 5, 'White': 6, 'GRAY': 3, 'RED': 2}
      >>> t = (zip(d.values(), d.keys()))
      >>> sorted(t)
      [(0, 'BLACK'), (1, 'brown'), (2, 'RED'), (2, 'violet'), (3, 'GRAY'), (4, 'BLUE'), (4, 'orange'), (5, 'green'), (6, 'White'), (7, 'YELLOW')]
      

      【讨论】:

      • 我需要将其作为排序字典返回,其中单词作为键,对应的值作为值
      【解决方案3】:

      使用sorted

      >>> d = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7, 'green': 5, 'BLUE': 4,
              'violet': 2, 'GRAY': 3, 'White': 6}
      >> sorted(d, key=lambda i: (d[i], i.lower()))
      ['BLACK', 'brown', 'RED', 'violet', 'GRAY', 'BLUE', 'orange', 'green', 'White', 'YELLOW']
      

      注意:这里假定所有内容都应该是小写的,因为 python 将大写单词排在小写单词之前。

      我还将您的变量重命名为 d,因为 dict 是内置的。

      分解正在发生的事情:

      字典上的sorted 返回由提供的函数key 排序的键(默认是键的直接比较)

      >>> sorted(d)
      ['BLACK', 'BLUE', 'GRAY', 'RED', 'White', 'YELLOW', 'brown', 'green', 'orange', 'violet']
      

      要按值排序,请使用dict.get

      >>> sorted(d, key=d.get)
      ['BLACK', 'brown', 'RED', 'violet', 'GRAY', 'orange', 'BLUE', 'green', 'White', 'YELLOW']
      

      然后我们必须按关键字排序,以防出现平局。因为python是一个一个地比较它的元组,我们可以构造一个(value, key)的元组,它会比较项目,如果它们相同,就会比较项目。

      >>> (4, "blue") < (4, "orange")
      True
      >>> (4, "blue") < (3, "orange")
      False
      

      【讨论】:

      • 看起来结果是错误的,如果我没有看错的话,4不应该出现在1之前
      • 哦,哎呀,我倒序排列了
      • @rassar 你只需要对具有相同值的单词按字母排序
      【解决方案4】:

      利用tuple 逐一比较其元素这一事实。

      d = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7, 'green': 5, 'BLUE': 4,
           'violet': 2, 'GRAY': 3, 'White': 6}
      result = sorted(d, key=lambda k: (d[k], k.lower()))
      

      还修正了 dict 不应用作变量名 - 它是一个内置类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-27
        • 1970-01-01
        • 2011-07-08
        • 1970-01-01
        • 1970-01-01
        • 2011-02-09
        相关资源
        最近更新 更多