2015-12-16 3 views
4

Как я могу отсортировать его по индивидуальному заказу?Элементы сортировки с определенным порядком в python

Вход:

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

Ожидать результат:

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

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

Мой питон код следующим прямо сейчас:

result = sorted(input, key=lambda v:v['value']) 
+1

Учитывая 'вход ',' result' являются недопустимыми литералами Python. Если вы имеете в виду словари, они должны быть '{" xxx1 ": {" value ":" typeA "}," xxx2 ": {" value ":" typeC "}, ...}' format. – falsetru

+0

Извините, обновите мои '' input'' и '' result'' –

+0

Это просто пример. Например: сортировка по определенному списку элементов '' type''. –

ответ

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

Сделать отображение между typeB, typeC, typeA на 0, 1, 2

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

и использовать отображение для сортировки ключ:

>>> sorted(lst, key=lambda d: order[d['value']]) 
[{'value': 'typeB'}, 
{'value': 'typeB'}, 
{'value': 'typeC'}, 
{'value': 'typeC'}, 
{'value': 'typeA'}, 
{'value': 'typeA'}] 
6

Попробуйте это:

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

У вас есть опечатка, код должен быть: 'sorted (input, key = lambda v: my_own_order.index (v [значение]))' (Нет цитаты вокруг 'value') – Linh

+0

Обратите внимание, что этот метод выполняет линейную поиск каждого элемента. –

Смежные вопросы