2014-01-08 6 views
0

Я следующую структуру данных:Python: Сортировка массива, основанный на подзначение

[ 
    { some: thing9, 
     key: 9, 
    }, 
    { some: thing3, 
     key: 3, 
    }, 
    { some: thing2, 
     key: 2, 
    }, 
    { some: thing1, 
     key: 1, 
    } 
] 

Как отсортировать этот массив на основе значения ключа словаря, так я получаю:

[ 
    { some: thing1, 
     key: 1, 
    }, 
    { some: thing2, 
     key: 2, 
    }, 
    { some: thing3, 
     key: 3, 
    }, 
    { some: thing9, 
     key: 9, 
    } 
] 

Благодаря

+0

И [Сортировка Dict по суб-значения в Python] (HTTP: // stackoverfl ow.com/questions/18384570/sort-dict-by-sub-value-in-python?rq=1) и различные другие дубликаты. Хотя большинство из них посвящено сортировке элементов 'dict', а не сортировке' list', в основном тот же ответ применяется без '.items()' part. – abarnert

ответ

2
sorted(data, key=operator.itemgetter('key')) 

Sorting HOWTO объясняет это более подробно. Но основная идея заключается в том, что все связанные со всеми функциями функции принимают аргумент key, вызываемый, который применяется к каждому значению перед сравнением значений.

Итак, мы хотим, чтобы key взял один из элементов вашего list и вернул то, что вы хотите отсортировать. Элементы: dict s, и вы хотите отсортировать по их номеру key. Функция itemgetter выполняет именно то, что вы хотите. (. Если эта функция не доступна, можно использовать, например, вместо lambda item: item['key'])

1

Если вы предпочитаете использовать лямбда-выражения, это также подходящий способ решения вашей проблемы:

sorted(data, key=lambda x: x['key']) 

So :

from pprint import pprint 

data = [ 
    { 'some': 'thing9', 
     'key': 9, 
    }, 
    { 'some': 'thing3', 
     'key': 3, 
    }, 
    { 'some': 'thing2', 
     'key': 2, 
    }, 
    { 'some': 'thing1', 
     'key': 1, 
    } 
] 

pprint(sorted(data, key=lambda x:x['key'])) 

выходы

[{'key': 1, 'some': 'thing1'}, 
{'key': 2, 'some': 'thing2'}, 
{'key': 3, 'some': 'thing3'}, 
{'key': 9, 'some': 'thing9'}] 
+0

@ Downvoter: Уточните? –

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