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中
:你们都是对的。刚刚在python3
sorted(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'})]