Вставить поле в объект при выполнении сортировки списка объектов в Python - PullRequest
0 голосов
/ 08 марта 2019

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

rows = [
  {'name': 'someone1', 'score': 20},
  {'name': 'someone2', 'score': 90},
  {'name': 'someone3', 'score': 60},
]

Я хочу добавить еще один ранг поля в зависимости от оценки. В настоящее время я делаю это в несколько этапов.

# Step 1: sort it
rows_sorted = sorted(rows, key=lambda x: x['score'], reverse=True)
# Step 2: add rank field
[row.setdefault('rank', idx) for idx, row in enumerate(rows_sorted, start=1)]

Так что теперь мой требуемый вывод - в row_sorted, который похож на

[{'name': 'someone2', 'score': 90, 'rank': 1},
 {'name': 'someone3', 'score': 60, 'rank': 2},
 {'name': 'someone1', 'score': 20, 'rank': 3}]

Есть ли способ сделать это за один шаг?

Ответы [ 2 ]

2 голосов
/ 08 марта 2019
rows = [
    dict(row, rank=idx + 1)
    for idx, row in enumerate(sorted(rows, key=lambda x: -x['score']))
]
0 голосов
/ 08 марта 2019

Попробуйте это:

all_scores = sorted([k['score'] for k in rows], reverse = True)
for i in rows:
    i['rank'] = all_scores.index(i['score'])+1

ВЫХОД :

>>> rows
[{'name': 'someone1', 'score': 20, 'rank': 3}, {'name': 'someone2', 'score': 90, 'rank': 1}, {'name': 'someone3', 'score': 60, 'rank': 2}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...