【问题标题】:sort dict by value python [duplicate]按值python对dict排序[重复]
【发布时间】:2013-05-22 05:52:50
【问题描述】:

假设我有一个字典。

data = {1:'b', 2:'a'}

我想按“b”和“a”对数据进行排序,以便得到结果

'a','b'

我该怎么做?
有什么想法吗?

【问题讨论】:

  • 如果我想要一个按值排序的键列表怎么办?所以原来的会返回 [2, 1],可能是一个按分数排序的玩家列表,例如丢弃分数。
  • @gseattle sorted(data.keys(), key=data.get)

标签: python dictionary python-2.6


【解决方案1】:

感谢所有回答。 你们都是我的英雄;-)

最后是这样的:

d = sorted(data, key = data.get)

for key in d:
    text = data[key]

【讨论】:

    【解决方案2】:

    您可以从 Values 创建排序列表并重建字典:

    myDictionary={"two":"2", "one":"1", "five":"5", "1four":"4"}
    
    newDictionary={}
    
    sortedList=sorted(myDictionary.values())
    
    for sortedKey in sortedList:
        for key, value in myDictionary.items():
            if value==sortedKey:
                newDictionary[key]=value
    

    输出:newDictionary={'one': '1', 'two': '2', '1four': '4', 'five': '5'}

    【讨论】:

      【解决方案3】:

      要获取值,请使用

      sorted(data.values())
      

      要获取匹配的键,请使用key 函数

      sorted(data, key=data.get)
      

      获取按值排序的元组列表

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

      相关:看这里的讨论:Dictionaries are ordered in Python 3.6+

      【讨论】:

      • 好的,抱歉。我的意思是得到 (2:'a',1:'b')... 任何想法?
      • @kingRauk,字典是无序的,但你可以制作一个有序的元组列表
      • sorted(data.items(), key=lambda x:x[1], reverse=True) 用于反转顺序
      【解决方案4】:

      没有 lambda 方法

      # sort dictionary by value
      d = {'a1': 'fsdfds', 'g5': 'aa3432ff', 'ca':'zz23432'}
      def getkeybyvalue(d,i):
          for k, v in d.items():
              if v == i:
                  return (k)
      
      sortvaluelist = sorted(d.values())
      sortresult ={}
      for i1 in sortvaluelist:   
          key = getkeybyvalue(d,i1)
          sortresult[key] = i1
      print ('=====sort by value=====')
      print (sortresult)
      print ('=======================')
      

      【讨论】:

        【解决方案5】:

        在回复 John 的评论中,您建议您需要字典的键和值,而不仅仅是值。

        PEP 256 建议按值对字典进行排序。

        import operator
        sorted(d.iteritems(), key=operator.itemgetter(1))
        

        如果要降序,请执行此操作

        sorted(d.iteritems(), key=itemgetter(1), reverse=True)
        

        【讨论】:

          【解决方案6】:

          从你的评论到 gnibbler 的回答,我想说你想要一个按值排序的键值对列表:

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

          【讨论】:

            【解决方案7】:

            我还认为重要的是要注意 Python dict 对象类型是一个哈希表 (more on this here),因此如果不将其键/值转换为列表就无法进行排序。这允许dict 在恒定时间内检索项目O(1),无论字典中元素的大小/数量如何。

            话虽如此,一旦您对其键 - sorted(data.keys()) 或值 - sorted(data.values()) 进行排序,您就可以使用该列表访问设计模式中的键/值,例如:

            for sortedKey in sorted(dictionary):
                print dictionary[sortedKeY] # gives the values sorted by key
            
            for sortedValue in sorted(dictionary.values()):
                print sortedValue # gives the values sorted by value
            

            希望这会有所帮助。

            【讨论】:

            • sorted(dictionary) 优于 sorted(dictionary.keys())
            • @jamylak 感谢您的建议,但我想知道它的行为模式是否与 .keys() 的行为不同?
            • 它在语义上是等价的,但速度更快,更惯用
            【解决方案8】:

            如果您真的想对字典进行排序而不是仅仅获得排序列表,请使用collections.OrderedDict

            >>> from collections import OrderedDict
            >>> from operator import itemgetter
            >>> data = {1: 'b', 2: 'a'}
            >>> d = OrderedDict(sorted(data.items(), key=itemgetter(1)))
            >>> d
            OrderedDict([(2, 'a'), (1, 'b')])
            >>> d.values()
            ['a', 'b']
            

            【讨论】:

            • 可悲的是,在 Python 2.6.5 中...不支持 OrderedDict
            • 是的,很抱歉……
            • @kingRauk 没问题,一切都好
            【解决方案9】:

            对值进行排序:

            sorted(data.values())
            

            返回

            ['a','b']
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-08-11
              • 1970-01-01
              • 2022-06-17
              • 1970-01-01
              • 1970-01-01
              • 2011-08-09
              • 2011-03-25
              相关资源
              最近更新 更多