Reputation: 1287
I have a list
mylist = [['123', 'BOOL', '234'], ['345', 'INT', '456'], ['567', 'DINT', '678']]
I want to sort it with the order of 1. DINT
2. INT
3. BOOL
Result:
[['567', 'DINT', '678'], ['345', 'INT', '456'], ['123', 'BOOL', '234']]
I've seen other similar questions in stackoverflow but nothing similar or easily applicable to me.
Upvotes: 44
Views: 36719
Reputation: 428
python 3.2
sorted(mylist,key=lambda x:x[1][1])
sorted(mylist,reverse=True)
Upvotes: -1
Reputation: 9003
You can define an explicit order by a list:
def explicit_order(xs):
"""Return a key function that, when passed to sort or sorted, will sort
the elements in the order they appear in this list.
"""
keys = {x: i for i, x in enumerate(xs)}
def key_function(x):
return keys[x]
return key_function
order = explicit_order(['DINT', 'INT', 'BOOL'])
sorted(['BOOL', 'INT'], key=order) # = ['INT', 'BOOL']
Since in your example you also have to extract the string from your tuples, you'll have a slightly more complex key-function:
sorted(mylist, key=lambda x: order(x[1]))
Upvotes: 1
Reputation: 917
Another way could be; set your order in a list:
indx = [2,1,0]
and create a new list with your order wished:
mylist = [mylist[_ind] for _ind in indx]
Out[2]: [['567', 'DINT', '678'], ['345', 'INT', '456'], ['123', 'BOOL', '234']]
Upvotes: 3
Reputation: 2300
Since that is not in aphabetical order I don't think there is one single function that can sort it but what you could do is create a new list and then append. This is kind of a cheap method of doing it; but it gets the job done.
newlist=[];
for sub_list in mylist:
if(sub_list[1] == 'DINT']):
newlist.append(sub_list);
for sub_list in mylist:
if(sub_list[1] == 'INT']):
newlist.append(sub_list);
for sub_list in mylist:
if(sub_list[1] == 'BOOL']):
newlist.append(sub_list);
Upvotes: 0
Reputation: 159905
SORT_ORDER = {"DINT": 0, "INT": 1, "BOOL": 2}
mylist.sort(key=lambda val: SORT_ORDER[val[1]])
All we are doing here is providing a new element to sort on by returning an integer for each element in the list rather than the whole list. We could use inline ternary expressions, but that would get a bit unwieldy.
Upvotes: 88