【问题标题】:How to order a dictionary by the value types without importing modules如何在不导入模块的情况下按值类型对字典进行排序
【发布时间】:2013-07-27 01:54:36
【问题描述】:

我正在尝试对这本字典进行排序:

dictionary = {24249:"t",390395:"b",90395:"q",5939:"z",1:"k",3909:"a"}

我看到人们使用 lambda 来执行此操作,但我试图通过仅使用 dict 方法来解决此问题。

我能够订购这些值:

ordered = sorted(dictionary.values())

但我不知道如何访问有序值的键。

【问题讨论】:

  • “访问密钥”是什么意思?
  • @JonClements 如果我想循环打印出字典的内容,我不需要密钥吗?
  • reverse dictionary order 的可能重复项

标签: python string methods dictionary


【解决方案1】:

我会那样做:

dictionary = {24249:"t",390395:"b",90395:"q",5939:"z",1:"k",3909:"a"}

val = dictionary.values()
val
['a', 'b', 'k', 'q', 't', 'z']

[{v:k for k,v in dictionary.items()}[i] for i in val]
[3909, 390395, 1, 90395, 24249, 5939]

【讨论】:

    【解决方案2】:

    这是一个不导入模块并且不使用lambda按值对字典进行排序的解决方案:

    dictionary = {24249: "t", 390395: "b", 90395: "q", 5939: "z", 1: "k", 3909: "a"}
    keys_sorted_by_value = sorted(dictionary, key=dictionary.get)
    

    按排序顺序打印:

    for key in keys_sorted_by_value:
        print("key: {key}, value: {value}".format(key=key, value=dictionary[key]))
    

    【讨论】:

      【解决方案3】:

      您可以使用OrderedDict。当然,这将要求您从 collections 模块导入一个类,但请记住 - “普通”字典不会保持其条目的顺序:

      有序字典就像普通字典一样,但它们会记住插入项目的顺序。遍历有序字典时,项按其键首次添加的顺序返回。

      例如,这是一个使用排序键进行插入顺序的字典,意思是:如果您对其进行迭代,条目将按键排序:

      from collections import OrderedDict
      dictionary = { 24249:'t', 390395:'b', 90395:'q', 5939:'z', 1:'k', 3909:'a' }
      
      OrderedDict(sorted(dictionary.items(), key=lambda x: x[0]))
      
      => OrderedDict([(1, 'k'), (3909, 'a'), (5939, 'z'),
                      (24249, 't'), (90395, 'q'), (390395, 'b')])
      

      【讨论】:

        【解决方案4】:

        在 Python 中,字典本质上是无序的。如果需要,您可以将字典转换为元组列表:

        result = sorted(dictionary.items(),key=lambda x: x[1])
        

        这会给你:

        [(3909, 'a'), (390395, 'b'), (1, 'k'), (90395, 'q'), (24249, 't'), (5939, 'z')]
        

        【讨论】:

        • 对,你需要把数据结构改成列表之类的。
        • +1,正要发布。你也可以像字典一样遍历result。例如。 for key, value in result: print key, value
        • 我见过类似的解决方案,但我试图避免使用 lambda。
        • @JonnyLamp : 使用itemgetter,但我猜你也不想这样,因为它是从operator 模块导入的。
        猜你喜欢
        • 1970-01-01
        • 2021-09-26
        • 2021-09-25
        • 2016-07-05
        • 1970-01-01
        • 2010-10-11
        相关资源
        最近更新 更多