Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort elements with specific order in python

How can I sort it by custom order?

Input:

[
    {value: "typeA"},
    {value: "typeC"},
    {value: "typeB"},
    {value: "typeC"},
    {value: "typeB"},
    {value: "typeA"}
]

Expect result:

[
    {value: "typeB"},
    {value: "typeB"},
    {value: "typeC"},
    {value: "typeC"},
    {value: "typeA"},
    {value: "typeA"}
]

my_own_order = ['typeB', 'typeC', 'typeA']

My python code as following right now:

result = sorted(input, key=lambda v:v['value'])
like image 652
Ertuğrul Altınboğa Avatar asked Dec 16 '15 09:12

Ertuğrul Altınboğa


1 Answers

>>> lst = [
...     {'value': "typeA"},
...     {'value': "typeC"},
...     {'value': "typeB"},
...     {'value': "typeC"},
...     {'value': "typeB"},
...     {'value': "typeA"}
... ]
>>> my_own_order = ['typeB', 'typeC', 'typeA']

Make a mapping between typeB, typeC, typeA to 0, 1, 2

>>> order = {key: i for i, key in enumerate(my_own_order)}
>>> order
{'typeA': 2, 'typeC': 1, 'typeB': 0}

And use the mapping for sorting key:

>>> sorted(lst, key=lambda d: order[d['value']])
[{'value': 'typeB'},
 {'value': 'typeB'},
 {'value': 'typeC'},
 {'value': 'typeC'},
 {'value': 'typeA'},
 {'value': 'typeA'}]
like image 68
falsetru Avatar answered Sep 21 '22 17:09

falsetru