【问题标题】:Sorting dictionary keys based on their values根据值对字典键进行排序
【发布时间】:2011-01-14 10:29:23
【问题描述】:

我有一个这样的 python 字典设置

mydict = { 'a1': ['g',6],
           'a2': ['e',2],
           'a3': ['h',3],
           'a4': ['s',2],
           'a5': ['j',9],
           'a6': ['y',7] }

我需要编写一个函数来返回列表中的有序键,具体取决于您在哪一列进行排序,例如,如果我们按 mydict[key][1](升序)进行排序

我应该收到这样的清单

['a2', 'a4', 'a3', 'a1', 'a6', 'a5']

它主要工作,除了当你有多个键的相同值的列时,例如。 'a2': ['e',2] 和'a4': ['s',2]。在这种情况下,它会像这样返回列表

['a4', 'a4', 'a3', 'a1', 'a6', 'a5']

这是我定义的函数

def itlist(table_dict,column_nb,order="A"):
    try:
        keys = table_dict.keys()
        values = [i[column_nb-1] for i in table_dict.values()]
        combo = zip(values,keys)
        valkeys = dict(combo)
        sortedCols = sorted(values) if order=="A" else sorted(values,reverse=True)
        sortedKeys = [valkeys[i] for i in sortedCols]
    except (KeyError, IndexError), e:
        pass
    return sortedKeys

如果我想对数字列进行排序,例如,它是这样调用的

sortedkeysasc = itmethods.itlist(table,2)

有什么建议吗?

保罗

【问题讨论】:

  • 你只需要使用sort函数的key kwarg

标签: python sorting


【解决方案1】:

用起来会不会方便很多

sorted(d, key=lambda k: d[k][1])

d 是字典)?

【讨论】:

  • 是的,迭代器的惰性也是一个特别的优势。这个解决方案比我的好,可惜我不能投票两次 %)
  • @ulidtko:懒惰不是特别相关,因为sorted() 无论如何都会在排序之前生成整个列表。这相当于在这里使用a = d.keys(); a.sort(key=lambda k: d[k][1]),但sorted(d.keys(), ...) 会创建列表的冗余副本。
  • 这很整洁。是否可以进行相反的操作,即根据键对字典值进行排序并仅在 1 行中返回值列表。在这个[v for (k,v) in sorted(d.iteritems(), key=lambda (k, v) : v ) ] 中基本上避免列表理解
  • @buffer:你不能做同样的事情,因为你不能查找给定值的键。我认为你的方法很好(可能用key=operator.itemgetter(1)代替)。替代方案是map(d.get, sorted(d)) 或相当不明显的itemgetter(*sorted(d))(d)
  • @buffer:我刚刚注意到您的代码实际上是按值排序,而不是按键排序,正如您在文本中所说的那样。如果这是你真正需要的,你根本不用看键,所以只需 sorted(d.itervalues()) 就可以了。
【解决方案2】:
>>> L = sorted(d.items(), key=lambda (k, v): v[1])
>>> L
[('a2', ['e', 2]), ('a4', ['s', 2]), ('a3', ['h', 3]), ('a1', ['g', 6]), ('a6', ['y', 7]), ('a5', ['j', 9])]

>>> map(lambda (k,v): k, L)
['a2', 'a4', 'a3', 'a1', 'a6', 'a5']

在这里,您使用 key 对字典项目(键值对)进行排序 - 可调用,它建立项目的总顺序。

然后,您只需使用 map 和仅选择键的 lambda 过滤掉所需的值。这样你就得到了所需的键列表。


编辑:请参阅this answer 以获得更好的解决方案。

【讨论】:

  • 我也有点偏爱[k for (k,v) in sorted(...)]
  • 天哪,非常感谢!代码也比我的解决方案少得多!
【解决方案3】:

虽然上面有多个可行的答案,但它们的细微变化/组合对我来说是最pythonic

[k for (k,v) in sorted(mydict.items(), key=lambda (k, v): v[1])]

【讨论】:

    【解决方案4】:
    >>> mydict = { 'a1': ['g',6],
    ...            'a2': ['e',2],
    ...            'a3': ['h',3],
    ...            'a4': ['s',2],
    ...            'a5': ['j',9],
    ...            'a6': ['y',7] }
    >>> sorted(mydict, key=lambda k:mydict[k][1])
    ['a2', 'a4', 'a3', 'a1', 'a6', 'a5']
    >>> sorted(mydict, key=lambda k:mydict[k][0])
    ['a2', 'a1', 'a3', 'a5', 'a4', 'a6']
    

    【讨论】:

      【解决方案5】:
      def itlist(table_dict, col, desc=False):
          return [key for (key,val) in
              sorted(
                  table_dict.iteritems(),
                  key=lambda x:x[1][col-1],
                  reverese=desc,
                  )
              ]
      

      【讨论】:

        猜你喜欢
        • 2011-12-11
        • 1970-01-01
        • 2014-10-23
        • 1970-01-01
        • 2011-02-11
        • 1970-01-01
        • 2015-11-23
        • 1970-01-01
        相关资源
        最近更新 更多