Issue
I have this dictionary:
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},
}
I've also got a function to pull all status_for
values of either owner
or dev
that looks like this and put it into a 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)
I'd like to order these by the position
value though. What is a good way to do this, so that when I populate by combobox I have it in a predefined order?
I realize that the snippet above is checking for both 'dev' and 'all', my assumption right now is that I'd have to loop through the dictionary twice to get the two separate blocks in the order I wish (ie. 'all' appears before 'dev').
I saw this post, but I'm not sure how to convert this answer to something that is a dictionary of dictionaries.
Solution
Would something like this work? Similar to the post you linked, this uses the key
function of sorted
to provide a custom sort order. iteritems()
returns a (key, value)
tuple, so that gets passed into lambda (x, y): y['position']
, where y['position']
is the value (your nested dictionary, keyed by the status), and position
is the item by which you want to sort.
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'})
Answered By - RocketDonkey
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.