2016-06-08 4 views
0

Имея список (MVCE) data, как показано ниже, я хотел бы сначала отсортировать его по координате x, а затем по координате y.
Я пробовал:Python, itemgetter сортировать список значений словарей из вложенного списка элементов

import operator 
data = [ 
    { "coords": [142, -42]}, 
    { "coords": [147, -42]}, 
    { "coords": [151, -41]}, 
    { "coords": [147, -41]}, 
    { "coords": [149, -44]}, 
    { "coords": [150, -41]}, 
    { "coords": [149, -40]}, 
    { "coords": [150, -42]}, 
    { "coords": [151, -40]} 
] 

k1 = operator.itemgetter("coords") 
# i've also tried various combinations like 
#k2 = lambda data: operator.itemgetter(data["coords"][0]),\ 
#     operator.itemgetter(data["coords"][1]) 
# but TypeError: list indices must be integers, not str 

e = [] 
for d in sorted(data, key=k1): 
    e.append(d) 
print("\n".join([str(s) for s in e])) 

, но это дает данные, только сортируются по X, Y, но не дальше.

>>> { "coords": [142, -42]} 
    { "coords": [147, -42]} 
    { "coords": [147, -41]} 
    { "coords": [149, -44]} 
    { "coords": [149, -40]} 
    { "coords": [150, -42]} 
    { "coords": [150, -41]} 
    { "coords": [151, -41]} 
    { "coords": [151, -40]} 

Я знаю, что я могу передать более одного аргумента itemgetter. Есть ли способ отсортировать это в одном заявлении?

(Желаемый результат)

>>> { "coords": [142, -42]} 
    { "coords": [147, -41]} 
    { "coords": [147, -42]} 
    { "coords": [149, -40]} 
    { "coords": [149, -44]} 
    { "coords": [150, -41]} 
    { "coords": [150, -42]} 
    { "coords": [151, -40]} 
    { "coords": [151, -41]} 

данных должна быть добавлена ​​к списку e, так как это является частью большей обработки.

Не дубликат sort-list-of-dictionaries-by-another-list или аналогичный, который мне удалось найти здесь. Большинство людей хотят отсортировать список словарей двумя значениями из dict, и здесь я хочу сортировать по двум значениям из вложенного списка.

+0

Возможная Дубликат (http://stackoverflow.com/q/4233476) –

+0

@BhargavRao Не дубликат, см. Мой править - последний абзац. –

+1

Вы проверили обман? Это по сути то же самое. Вы можете изменить обман, чтобы адаптировать вашу проблему следующим образом: sorted (data, key = lambda x: (x ['coords'] [0], x ['coords'] [1])). Я только что добавил диктовку к обману. –

ответ

3

Его - - сортировка надлежащим образом; -42 < -41, например.

Чтобы получить заказ, Вы, кажется, хотите, вы могли бы свести на нет координату у: [? Упорядочить список по нескольким атрибутам]

k1 = lambda x: (x['coords'][0], -x['coords'][1]) 
+0

... вы правы. Отрицательный знак меня смутил. Тем не менее, вы должны, вероятно, оставить его, если кто-то хочет, чтобы сортировка восходила сначала, и спускалась другим. –

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