Python 按值对字典进行排序
我有这本字典:Python 按值对字典进行排序,python,dictionary,pyqt,Python,Dictionary,Pyqt,我有这本字典: statuses = { 'pending' : {'status_for':'all', 'position':1}, 'cancelled' : {'status_for':'all','position':2}, 'approved' : {'status_for':'owner', 'position':1}, 'rejected - owner' : {'status_for
statuses = {
'pending' : {'status_for':'all', 'position':1},
'cancelled' : {'status_for':'all','position':2},
'approved' : {'status_for':'owner', 'position':1},
'rejected - owner' : {'status_for':'owner', 'position':2},
'accepted' : {'status_for':'dev', 'position':1},
'rejected - developer' : {'status_for':'dev', 'position':3},
'closed' : {'status_for':'dev', 'position':5},
}
我还有一个函数,可以为owner
或dev
的status>值提取所有status\u,如下所示,并将其放入PyQt QComboBox中:
for s in statuses:
if statuses[s]['status_for'] == "dev" or statuses[s]['status_for'] == "all":
cb_developer_status.addItem(s.capitalize(), s)
不过我想按位置
值订购这些。这样做的好方法是什么,这样当我通过combobox填充时,我就可以按照预定义的顺序填充它了
我意识到上面的代码段同时检查了“dev”和“all”,我现在的假设是,我必须在字典中循环两次,才能按照我希望的顺序获得两个独立的块(即“all”出现在“dev”之前)
我看到了,但我不知道如何将这个答案转换成
是一本字典词典。你喜欢这本书吗?与链接的帖子类似,它使用排序
的键
功能提供自定义排序顺序iteritems()
返回一个(键,值)
元组,这样它就被传递到lambda(x,y):y['position']
,其中y['position']
是值(您的嵌套字典,由状态键控),而position
是您想要排序的项
In [35]: statuses = {
'pending' : {'status_for':'all', 'position':1},
'cancelled' : {'status_for':'all','position':2},
'approved' : {'status_for':'owner', 'position':1},
'rejected - owner' : {'status_for':'owner', 'position':2},
'accepted' : {'status_for':'dev', 'position':1},
'rejected - developer' : {'status_for':'dev', 'position':3},
'closed' : {'status_for':'dev', 'position':5},
}
In [44]: for s in sorted(statuses.iteritems(), key=lambda (x, y): y['position']):
....: print s
....:
....:
('accepted', {'position': 1, 'status_for': 'dev'})
('approved', {'position': 1, 'status_for': 'owner'})
('pending', {'position': 1, 'status_for': 'all'})
('rejected - owner', {'position': 2, 'status_for': 'owner'})
('cancelled', {'position': 2, 'status_for': 'all'})
('rejected - developer', {'position': 3, 'status_for': 'dev'})
('closed', {'position': 5, 'status_for': 'dev'})
或者使用操作符.getitem()
:
key=lambda(k,v):v['position']
对眼睛来说更容易+1@JonClements请注意,在python3中,key=lambda(k,v):v['position']
必须写成key=lambda k_v:k_v[1]['position']
和dict.iteritems()
在python3中
:你们都是对的。刚刚在python3sorted(statuses.items(),key=lambda k_v:k_v[1]['position'])中成功测试过。
In [232]: statuses = {
'pending' : {'status_for':'all', 'position':1},
'cancelled' : {'status_for':'all','position':2},
'approved' : {'status_for':'owner', 'position':1},
'rejected - owner' : {'status_for':'owner', 'position':2},
'accepted' : {'status_for':'dev', 'position':1},
'rejected - developer' : {'status_for':'dev', 'position':3},
'closed' : {'status_for':'dev', 'position':5},
}
In [235]: sorted(statuses,key=lambda x:statuses[x]['position'])
Out[235]:
['accepted',
'approved',
'pending',
'rejected - owner',
'cancelled',
'rejected - developer',
'closed']
In [260]: from operator import *
In [261]: sorted(statuses.items(),key=lambda x:getitem(x[1],'position'))
Out[261]:
[('accepted', {'position': 1, 'status_for': 'dev'}),
('approved', {'position': 1, 'status_for': 'owner'}),
('pending', {'position': 1, 'status_for': 'all'}),
('rejected - owner', {'position': 2, 'status_for': 'owner'}),
('cancelled', {'position': 2, 'status_for': 'all'}),
('rejected - developer', {'position': 3, 'status_for': 'dev'}),
('closed', {'position': 5, 'status_for': 'dev'})]