Ertuğrul Altınboğa
Ertuğrul Altınboğa

Reputation: 2607

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'])

Upvotes: 18

Views: 26087

Answers (3)

vernit jain
vernit jain

Reputation: 11

Taking an input and set the order in my_order and it will print in that order

enter code here

user_input = input()
my_order = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1357902468'
print(*sorted(user_input, key=my_order.index),sep='')

Upvotes: 1

John Zwinck
John Zwinck

Reputation: 249133

Try this:

sorted(input, key=lambda v: my_own_order.index(v['value']))

Upvotes: 7

falsetru
falsetru

Reputation: 369054

>>> 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'}]

Upvotes: 40

Related Questions