我有一个像这样的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)
那么有什么建议吗?
保
答案 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,
)
]