Имея список (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, и здесь я хочу сортировать по двум значениям из вложенного списка.
Возможная Дубликат (http://stackoverflow.com/q/4233476) –
@BhargavRao Не дубликат, см. Мой править - последний абзац. –
Вы проверили обман? Это по сути то же самое. Вы можете изменить обман, чтобы адаптировать вашу проблему следующим образом: sorted (data, key = lambda x: (x ['coords'] [0], x ['coords'] [1])). Я только что добавил диктовку к обману. –