Python сортирует список словарей - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть список словарей:

AccountValues = [
{'portfolio_ref': 1, 'tag': 'FullInit', 'value': '20642.95', 'currency': 'USD', 'percent': 0.0}, 
{'portfolio_ref': 1, 'tag': 'FullMaint', 'value': '21350.54', 'currency': 'USD', 'percent': 0.0}, 
{'portfolio_ref': 1, 'tag': 'NetLiq', 'value': '70976.05', 'currency': 'USD', 'percent': 100.0} ]

Простая миссия на описание SQL: Порядок по портфелю ASC, проценты DESC

То, что я безуспешно пытался:

sorted(AccountsValues, key=lambda x: (x[1],-x[4]))

, что дает мне

KeyError: 1

Вторая попытка:

import operator
result = sorted(myAccountsValues, key=itemgetter('percent'))

, которая не может быть отсортирована по процентам.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Вам просто нужно объединить все, что вы сделали правильно: сортировать ключи как кортеж и , чтобы правильно ссылаться на запись dict:

>>> sorted(AccountValues, key=lambda x: (x["portfolio_ref"], -x["percent"]))
[{'tag': 'NetLiq', 'portfolio_ref': 1, 'value': '70976.05', 'percent': 100.0, 'currency': 'USD'},
 {'tag': 'FullInit', 'portfolio_ref': 1, 'value': '20642.95', 'percent': 0.0, 'currency': 'USD'},
 {'tag': 'FullMaint', 'portfolio_ref': 1, 'value': '21350.54', 'percent': 0.0, 'currency': 'USD'}]

Еще лучше,используйте

sorted(AccountValues, key=itemgetter("portfolio_ref", "percent"))

Ваша первая попытка не удалась, потому что x[1] и x[4] не являются допустимыми ссылками на словари: вы должны использовать метки, которые вы изначально дали, а не относительные позиции.

Ваша вторая попытка неэффективна только потому, что у вас нет вторичного ключа сортировки.

0 голосов
/ 26 сентября 2018

Вы можете использовать dict.__getitem__ или его синтаксический сахар []:

res = sorted(AccountValues, key=lambda x: (x['portfolio_ref'], -x['percent']))

Помните, что словари не индексируются целыми числами.Исторически (до 3.6) они даже не упорядочены.Даже в Python 3.7 вы не можете напрямую извлечь n -й ключ или значение.

Результат:

print(res)

[{'portfolio_ref': 1, 'tag': 'NetLiq', 'value': '70976.05', 'currency': 'USD', 'percent': 100.0},
 {'portfolio_ref': 1, 'tag': 'FullInit', 'value': '20642.95', 'currency': 'USD', 'percent': 0.0},
 {'portfolio_ref': 1, 'tag': 'FullMaint', 'value': '21350.54', 'currency': 'USD', 'percent': 0.0}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...