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]) |
(以
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'] |
在这里,您将使用可调用键对字典项(键值对)进行排序,该键可对这些项建立总顺序。
然后,您只需使用一个
编辑:查看此答案以获得更好的解决方案。
尽管上面有很多有效的答案,但它们的细微变化/组合对我来说是最为重要的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, ) ] |