根据字典值排序键
我有一个这样的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
是指字典)