根据字典值排序键

22 投票
5 回答
35763 浏览
提问于 2025-04-16 09:57

我有一个这样的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)

所以有什么建议吗?

保罗

5 个回答

3

虽然上面有很多有效的答案,但我觉得它们稍微变一下或者组合起来的方式是最“python风格”的:

[k for (k,v) in sorted(mydict.items(), key=lambda (k, v): v[1])]
10
>>> 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 表达式来筛选出需要的值,这个表达式只会选择键。这样,你就得到了想要的键的列表。


编辑:可以查看 这个回答,里面有一个更好的解决方案。

56

这样用不是更简单吗?

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

(这里的 d 是指字典)

撰写回答