【问题标题】:Sort dictionary first by key, then by value首先按键排序字典,然后按值排序
【发布时间】:2014-01-18 23:17:11
【问题描述】:

我想对可能有 int 或 tuple 作为键的字典进行双重排序。

d = {33:1, 44:1, (0,5):1  12:2, (1,2):2}

我希望它首先按其值排序,其次按其键排序(如果可能,不是一个是元组,第二个是 int)。

谁能帮我解决这个问题?

提前致谢

【问题讨论】:

标签: python sorting dictionary


【解决方案1】:

或者只是

sorted(d.items(), key=lambda v: v[::-1])

编辑: 由于 OP 需要将结果作为字典

OrderedDict(sorted(d.items(), key=lambda v: v[::-1]))

【讨论】:

    【解决方案2】:
    >>> d = {33:1, 44:1, (0,5):1, 12:2, (1,2):2}
    >>> {k:v for k,v in sorted(d.items(), key=lambda v: v[::-1])}
    {(1, 2): 2, 33: 1, 44: 1, (0, 5): 1, 12: 2}
    >>> from collections import OrderedDict
    >>> OrderedDict({k:v for k,v in sorted(d.items(), key=lambda v: v[::-1])})
    OrderedDict([((1, 2), 2), (33, 1), (44, 1), ((0, 5), 1), (12, 2)])
    >>> sorted(d.items(), key=lambda v: v[::-1])
    [(33, 1), (44, 1), ((0, 5), 1), (12, 2), ((1, 2), 2)]
    

    【讨论】:

    • 除非你使用OrderedDict,否则无法保证排序字典的顺序
    • 字典本质上是未排序的。一旦您修改条目,OrderedDicts 也不会排序。除非您将其设为具有不可变值的 FrozenOrderedDict,否则不应返回 OrderedDict。如果您要求某事物的排序视图,请返回元组、列表或生成器,而不是字典。创建这个 OrderedDict 也是浪费时钟周期,因为您关心的唯一方法是 __iter__,您可以从 sorted() 的输出中获得该方法
    • @IceArdor,由于 OrderedDicts 是按项目添加到字典中的顺序排序的,因此它们可以用于 OP。
    • @volcano 我没有将 OP 的问题解释为需要将结果作为 OrderedDict。获取键的值时,排序顺序无关紧要。我坚持我之前的说法。要么使用重新定义的__iter__ 创建您自己的字典类,要么创建一个新对象,它是一个元组/列表/生成器来迭代排序的键。
    • @IceArdor,当您遍历键时,顺序可能很重要。元组可能很麻烦 - 链式索引倾向于使代码混乱并使其不可读。当 OrederedDictionary 可以使用时,为什么要重新发明自行车?顺便说一句,它在标准 Python 库中的事实表明它背后有一个有效的用例。创建新对象?完全反KISS
    【解决方案3】:

    这个怎么样?

    >>> d = {33:1, 44:1, (0,5):1, 12:2, (1,2):2}
    >>> helper_dict = {}
    >>> for k,v in d.items():
            helper_dict.setdefault(v,[]).append(k)    
    
    >>> sorted_items = [(k,i) for k in sorted(helper_dict.keys()) for i in sorted(helper_dict[k]) ]
    >>> sorted_items
    [(1, 33), (1, 44), (1, (0, 5)), (2, 12), (2, (1, 2))]
    

    【讨论】:

      【解决方案4】:

      首先,您应该注意您可能对字典进行排序。你可能会得到一个键/值排序的列表,但不是字典本身。您可能会在 pydocs 中找到

      最好将字典视为一组无序的键:值 对

      然后,您可能想要获得排序后的键列表:

      # the .keys() returns a list with all the keys, and sorted() sorts them
      #sorted_keys = sorted(d.keys()) this does not work since int's and tuples aren't of the same tipe
      

      你可以试试这个:

      d_tuples = []
      d_int = []
      sorted_keys = []
      for key in d.keys():
          # type() checks the variable type
          if type(key) == int:
              d_int.append(key)
          elif type(key) == tuple:
              d_tuples.append(key)
      sorted_keys = d_tuples + sorted(d_int)
      

      或排序后的值列表:

      sorted_values = sorted(d.values())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-03
        • 2023-03-30
        • 2020-09-14
        • 2013-06-29
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 2023-03-05
        相关资源
        最近更新 更多