【问题标题】:Sorting a dictionary by key, where the key is a mixture of string and number, then make a new dictionary with sorted key_values按键对字典进行排序,其中键是字符串和数字的混合,然后用排序后的 key_values 制作一个新字典
【发布时间】:2018-08-09 12:27:02
【问题描述】:

我有一本字典

dict1={'A_11':2,'A_10':5,'A_3':11,'A_2':6}

我想按键排序得到

dict1_sorted={'A_2':6,'A_3':11,'A_10':5,'A_11':2}

我试过了,但还是成功了

{'A_10': 5, 'A_11': 2, 'A_2': 6, 'A_3': 11}.

有什么建议吗?谢谢。

【问题讨论】:

  • print( sorted(dict1.items(), key=lambda x: x[0]) ) ?

标签: python sorting dictionary key


【解决方案1】:

如果您使用的是 Python 3.6+,则对 dicts 进行排序,以便您可以这样做:

dict1={'A_11':2,'A_10':5,'A_3':11,'A_2':6}
def f(k):
    t = k.split('_')
    return t[0], int(t[1])
print({k: dict1[k] for k in sorted(dict1, key=f)})

这个输出:

{'A_2': 6, 'A_3': 11, 'A_10': 5, 'A_11': 2}

如果您使用的是较早的 Python 版本,则可以将字典替换为 collections.OrderedDict

【讨论】:

    【解决方案2】:

    dict 不保留顺序,除非您使用 python3.7。所以请改用OrderedDict

    >>> from collections import OrderedDict
    >>> dict1={'A_11':2,'A_10':5,'A_3':11,'A_2':6}
    >>> OrderedDict({k:dict1[k] for k in sorted(dict1, key=lambda x: int(x.split('_')[-1]))})
    OrderedDict([('A_2', 6), ('A_3', 11), ('A_10', 5), ('A_11', 2)])
    

    【讨论】:

      【解决方案3】:

      key 中使用sortedlambda

      例如:

      dict1={'A_11':2,'A_10':5,'A_3':11,'A_2':6}
      print( sorted(dict1.items(), key=lambda x: x[0]) )
      

      输出:

      [('A_10', 5), ('A_11', 2), ('A_2', 6), ('A_3', 11)]
      

      from collections import OrderedDict
      dict1={'A_11':2,'A_10':5,'A_3':11,'A_2':6}
      print( OrderedDict(sorted(dict1.items(), key=lambda x: x[0])) )
      

      【讨论】:

        【解决方案4】:

        字典不是可排序的数据结构。如果需要排序,可以使用不同的数据类型。我会提出以下建议:

        dict1 = {'A_11':2,'A_10':5,'A_3':11,'A_2':6}
        
        orderable = sorted(dict1.items(), key=lambda x: int(x[0].split('_')[-1]))
        print(orderable)  # [('A_2', 6), ('A_3', 11), ('A_10', 5), ('A_11', 2)]
        

        也不是你请求的排序不是 Python 默认的排序字符串。您似乎对从字符串中包含的数字派生的顺序感兴趣。

        【讨论】:

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