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

PDS*_*tat 17 python sorting

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

mydict = { 'a1': ['g',6],
           'a2': ['e',2],
           'a3': ['h',3],
           'a4': ['s',2],
           'a5': ['j',9],
           'a6': ['y',7] }
Run Code Online (Sandbox Code Playgroud)

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

我应该像这样收到一份清单

['a2', 'a4', 'a3', 'a1', 'a6', 'a5']
Run Code Online (Sandbox Code Playgroud)

它主要起作用,除了你有多个键的相同值的列,例如.'a2':['e',2]和'a4':['s',2].在这个例子中,它返回列表,如此

['a4', 'a4', 'a3', 'a1', 'a6', 'a5']
Run Code Online (Sandbox Code Playgroud)

这是我定义的功能

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
Run Code Online (Sandbox Code Playgroud)

如果我想对数字列进行排序,例如它就像这样被调用

sortedkeysasc = itmethods.itlist(table,2)
Run Code Online (Sandbox Code Playgroud)

那有什么建议吗?

保罗

Sve*_*ach 46

使用它会不会容易得多

sorted(d, key=lambda k: d[k][1])
Run Code Online (Sandbox Code Playgroud)

(d作为字典)?


uli*_*tko 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']
Run Code Online (Sandbox Code Playgroud)

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

然后,你就过滤掉使用需要的值maplambda刚刚选择的关键.所以你得到了所需的密钥列表.


编辑:看到这个答案更好的解决方案.

  • 我有点偏向`[k for(k,v)in sorted(...)]`. (3认同)