В Python как отсортировать список словарей по определенному значению словаря + по алфавиту? - PullRequest
3 голосов
/ 22 мая 2009

Хорошо, вот что я пытаюсь сделать ... Я знаю, что сортировка itemgetter () может быть легко отсортирована по алфавиту, но если у меня есть что-то вроде этого:

[{'Name': 'TOTAL', 'Rank': 100}, {'Name': 'Woo Company', 'Rank': 15}, {'Name': 'ABC Company', 'Rank': 20}]

И я хочу, чтобы он сортировался в алфавитном порядке (по имени) + включил условие, что тот, у которого есть имя: «ВСЕГО», должен быть указан последним в последовательности, например:

[{'Name': 'ABC Company', 'Rank': 20}, {'Name': 'Woo Company', 'Rank': 15}, {'Name': 'TOTAL', 'Rank': 100}]

Как бы я это сделал?

Ответы [ 4 ]

10 голосов
/ 22 мая 2009

Лучший подход здесь - это декорировать ключ сортировки ... Python будет сортировать кортеж по компонентам кортежа по порядку, поэтому создайте ключ кортежа с вашими критериями сортировки:

sorted(list_of_dicts, key=lambda d: (d['Name'] == 'TOTAL', d['Name'].lower()))

В результате получается ключ сортировки:

  • (True, 'total') для {'Name': 'TOTAL', 'Rank': 100}
  • (False, 'woo company') для {'Name': 'Woo Company', 'Rank': 15}
  • (False, 'abc company') для {'Name': 'ABC Company', 'Rank': 20}

Так как False сортирует раньше, чем True, те, чьи имена не являются TOTAL, будут в итоге объединены, затем будут отсортированы по алфавиту, и TOTAL закончится в конце.

1 голос
/ 22 мая 2009
>>> lst = [{'Name':'TOTAL', 'Rank':100}, {'Name':'Woo Company', 'Rank':15}, {'Name':'ABC Company', 'Rank':20}]
>>> lst.sort(key=lambda d: (d['Name']=='TOTAL',d['Name'].lower()))
>>> print lst
[{'Name': 'ABC Company', 'Rank': 20}, {'Name': 'Woo Company', 'Rank': 15}, {'Name': 'TOTAL', 'Rank': 100}]
0 голосов
/ 22 мая 2009

Ну, я бы отсортировал его за несколько проходов, используя метод сортировки списка.

list = [{'Name':'TOTAL', 'Rank':100}, {'Name':'Woo Company', 'Rank':15}, {'Name':'ABC Company', 'Rank':20}]

list.sort(key = lambda x: x['Name']) # Sorted by Name, alphabetically

list.sort(key = lambda x: 'b' if x['Name'] == 'TOTAL' else 'a')
0 голосов
/ 22 мая 2009

Используйте параметр key для сортировки или сортировки.

Например:

dicts = [
     {'Name':'TOTAL', 'Rank':100}, 
     {'Name':'Woo Company', 'Rank':15},
     {'Name':'ABC Company', 'Rank':20}
]

def total_last(d):
    if d['Name'] == 'TOTAL':
        return '\xff\xff\xff\xff\xff\xff'
    return d['Name'].lower()

import pprint
pprint.pprint(sorted(dicts, key = total_last))

>python sort_dict.py
[{'Name': 'ABC Company', 'Rank': 20},
 {'Name': 'Woo Company', 'Rank': 15},
 {'Name': 'TOTAL', 'Rank': 100}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...