Как отсортировать список словарей по 2 ключам, один из которых основан на произвольном списке - PullRequest
1 голос
/ 19 ноября 2011

Я использую Python.Как отсортировать список словарей, приведенных ниже, сначала по «дню», а затем по «заданию».
Сортировка по «заданию» должна основываться на приоритете (не по алфавиту):

priority_list= ['c','a','b']

my_list_of_dicts = [
{'day':5,'job':'c','irrelevant_key':'more stuff'},
{'day':1,'job':'a','irrelevant_key':'stuff'},
{'day':5,'job':'b','irrelevant_key':'more stuff'},
{'day':1,'job':'b','irrelevant_key':'other stuff'}
]

результатсортировки должно быть:

[{'day':1,'job':'a','irrelevant_key':'stuff'},
{'day':1,'job':'b','irrelevant_key':'other stuff'},
{'day':5,'job':'c','irrelevant_key':'more stuff'},
{'day':5,'job':'b','irrelevant_key':'more stuff'}]

Спасибо большое,

Ответы [ 3 ]

3 голосов
/ 19 ноября 2011
my_list_of_dicts.sort(key=lambda x: (x['day'], priority_list.index(x['job'])))
3 голосов
/ 19 ноября 2011
def key(d):
    return d['day'], priority_list.index(d['job'])

sorted(my_list_of_dicts, key=key)
2 голосов
/ 19 ноября 2011

Для очень маленького списка, такого как ваш пример, ответы, использующие list.index(), будут работать нормально.

Однако, если список большой, стоило бы потратить время на создание dictиз priority_list.dict поисков O (1), в то время как list поисков O (N).

priority_dict = dict((x, i) for i, x in enumerate(priority_list))

def key_day_priority(d):
    return d['day'], priority_dict[d['job']]

my_list_of_dicts.sort(key=key_day_priority)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...