根据字符串值对字典键进行排序

时间:2011-01-14 10:29:23

标签: python sorting

我有一个像这样的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 个答案:

答案 0 :(得分:45)

使用

会不会容易得多
sorted(d, key=lambda k: d[k][1])

d是字典)?

答案 1 :(得分:9)

>>> 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只选择密钥。所以你得到了所需的密钥列表。


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

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

>>> 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']

答案 4 :(得分:0)

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,
            )
        ]