У меня есть словарь, который содержит список словарей:
example = {
"first": [
{"a": 1, "b": 2},
{"a": 0, "x": 5}
],
"second": [
{"a": 5, "b": 2},
{"a": 2, "x": 5}
]
}
Я хочу отсортировать списки «первый» и «второй» на основе значений ключа «а». Желаемый результат:
desired = {
"first": [
{"a": 0, "x": 5},
{"a": 1, "b": 2}
],
"second": [
{"a": 2, "x": 5},
{"a": 5, "b": 2}
]
}
Теперь я не хочу создавать совершенно новый словарь. Просто обновите списки «первый» и «второй» в «примере» dict. Что я пробовал:
from operator import itemgetter
for k, v in example.items():
v = sorted(v, key=itemgetter('a'))
Это не влияет на мой пример словаря. Однако он работает для одного списка, например:
x = [{"a": 1, "b": 2},
{"a": 0, "x": 5}
]
z = sorted(x, key = itemgetter('a'))
>>> print(z)
[{'a': 0, 'x': 5}, {'a': 1, 'b': 2}]
Один лайнер без необходимости itemgetter
. example = {k: sorted(v, key=lambda x: x['a']) for k, v in example.items()}
Это связано с тем, что когда вы назначаете отсортированный список, вы просто указываете «метку» v
на отсортированный список, а не записываете его в словарь. См. ниже, этот код должен делать то, что вы хотите.
for k, v in example.items():
example[k] = sorted(v, key=itemgetter('a'))
sorted
возвращает новый отсортированный список. В списке есть встроенный метод sort
, который сортирует список на месте.
for v in example.values():
v.sort(key=itemgetter('a'))
Ваш первый пример не сработал, потому что
v
не имеет обратной связи с исходным словарем; это просто обычная локальная переменная.