Как отсортировать словарь в Python по нескольким параметрам? - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть четыре отдельных словаря с такими же ключами, как указано ниже:

s = {'name': 'Spain', 'wins': 1, 'loses' : 1, 'draws': 1, 'goal, difference': 4, 'points': 4}
e = {'name': 'England', 'wins': 2, 'loses' : 1, 'draws': 0, 'goal difference': 1, 'points': 6}
p = {'name': 'Portugal', 'wins': 0, 'loses' : 1, 'draws': 2, 'goal difference': 0, 'points': 2}
g = {'name': 'Germany', 'wins': 1, 'loses' : 1, 'draws': 1, 'goal difference': 5, 'points': 4}

Цель состоит в том, чтобы отсортировать их по «точкам», и, если он равен, он должен быть отсортирован по имени алфавита какследуйте:

'England' 'wins': 2 'loses' : 1 'draws': 0 'goal difference': 1 'points': 6
'Germany' 'wins': 1 'loses' : 1 'draws': 1 'goal difference': 5 'points': 4
'Spain' 'wins': 1 'loses' : 1 'draws': 1 'goal, difference': 4 'points': 4
'Portugal' 'wins': 0 'loses' : 1 'draws': 2 'goal difference': 0 'points': 2

Любая идея будет отличной.

Ответы [ 3 ]

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

Вы можете передать параметр key в функцию Python stdlib sort или sorted для настройки сортировки.В вашем случае это будет:

custom_order = sorted([s, e, p, g], key=lambda d: (-d['points'], d['name']))

Объяснение: сортировка в нашем случае сравнивает динамически создаваемые кортежи числа и имени отрицательных точек.Кортежи сравниваются по первым элементам, а если они равны, по вторым и т. Д. Таким образом, ваши суждения будут сравниваться по точкам, а если точки равны, по имени, как вы и хотели.Точки являются отрицательными для достижения нисходящего порядка по точкам, но сохраняют восходящий по именам.

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

Если вы хотите иметь собственную функцию вместо лямбда-функции, это будет:

def sort_func(x):
    return -x['points'], x['name']

for d in sorted([s ,e, p, g], key=sort_func):
    print(d)
0 голосов
/ 28 сентября 2018
s = {'name': 'Spain', 'wins': 1, 'loses' : 1, 'draws': 1, 'goal, difference': 4, 'points': 4}
e = {'name': 'England', 'wins': 2, 'loses' : 1, 'draws': 0, 'goal difference': 1, 'points': 6}
p = {'name': 'Portugal', 'wins': 0, 'loses' : 1, 'draws': 2, 'goal difference': 0, 'points': 2}
g = {'name': 'Germany', 'wins': 1, 'loses' : 1, 'draws': 1, 'goal difference': 5, 'points': 4}

l = [s, e, p, g]

sorted(l, key=lambda x: (-x['points'], x['name']))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...