关于python:根据字典键的值对其进行排序

Sorting dictionary keys based on their values

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

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

我需要编写一个函数,根据排序所依据的列返回列表中已排序的键,例如,如果我们在mydict[key][1]上排序(升序)

我应该收到这样的清单

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

除了多个键具有相同值的列(例如"a2":["e",2]和"a4":["s",2])外,它主要起作用。在这个例子中,它返回的列表是这样的

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

这是我定义的函数

1
2
3
4
5
6
7
8
9
10
11
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

例如,如果我想对数字列进行排序,它被称为

1
sortedkeysasc = itmethods.itlist(table,2)

有什么建议吗?

保罗


用起来容易吗

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

(以d为字典)?


1
2
3
4
5
6
>>> 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']

在这里,您将使用可调用键对字典项(键值对)进行排序,该键可对这些项建立总顺序。

然后,您只需使用一个map和一个lambda筛选出所需的值,后者只选择键。所以你得到了需要的钥匙列表。

编辑:查看此答案以获得更好的解决方案。


尽管上面有很多有效的答案,但它们的细微变化/组合对我来说是最为重要的Python:

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

1
2
3
4
5
6
7
8
9
10
>>> 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']

1
2
3
4
5
6
7
8
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,
            )
        ]