And*_*ndy 17 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':'owner', 'position':2},
'accepted' : {'status_for':'dev', 'position':1},
'rejected - developer' : {'status_for':'dev', 'position':3},
'closed' : {'status_for':'dev', 'position':5},
}
Run Code Online (Sandbox Code Playgroud)
我还有一个函数来拉status_for取其中任何一个owner或dev看起来像这样的值并将其放入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)
Run Code Online (Sandbox Code Playgroud)
我想通过position价值来订购这些.有什么好办法可以做到这一点,所以当我用组合框填充时,我按照预定义的顺序进行填充?
我意识到上面的代码片段正在检查'dev'和'all',我现在的假设是我必须循环遍历字典两次才能按照我希望的顺序获得两个独立的块(即'all' '出现在'dev'之前).
我看过这篇文章,但我不确定如何将这个答案转换成字典词典.
Roc*_*key 27
会这样的吗?类似于您联系后,该使用key的功能sorted提供自定义排序次序.iteritems()返回一个(key, value)元组,以便传入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'})
Run Code Online (Sandbox Code Playgroud)
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']
Run Code Online (Sandbox Code Playgroud)
或使用operator.getitem():
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'})]
Run Code Online (Sandbox Code Playgroud)