Заказ списка словарей в python - PullRequest
8 голосов
/ 14 мая 2009

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

mylist = [
{'id':0, 'weight':10, 'factor':1, 'meta':'ABC'},
{'id':1, 'weight':5, 'factor':1, 'meta':'ABC'},
{'id':2, 'weight':5, 'factor':2, 'meta':'ABC'},
{'id':3, 'weight':1, 'factor':1, 'meta':'ABC'}
]

Какой самый эффективный / самый чистый способ упорядочить этот список по весу, а затем по коэффициенту (численно). Полученный список должен выглядеть так:

mylist = [
{'id':3, 'weight':1, 'factor':1, 'meta':'ABC'},
{'id':1, 'weight':5, 'factor':1, 'meta':'ABC'},
{'id':2, 'weight':5, 'factor':2, 'meta':'ABC'},
{'id':0, 'weight':10, 'factor':1, 'meta':'ABC'},
]

Ответы [ 4 ]

23 голосов
/ 14 мая 2009
mylist.sort(key=lambda d: (d['weight'], d['factor']))

или

import operator
mylist.sort(key=operator.itemgetter('weight', 'factor'))
1 голос
/ 14 мая 2009

Я принял ответ Д.Ф. за вдохновение, но вот что я в итоге остановился на своем сценарии:

@staticmethod
def ordered_list(mylist):
    def sort_func(d):
        return (d['weight'], d['factor'])

    mylist.sort(key=sort_func)
1 голос
/ 14 мая 2009

Должно работать что-то вроде следующего:

def cmp_dict(x, y):
    weight_diff = y['weight'] - x['weight']
    if weight_diff == 0:
        return y['factor'] - x['factor']
    else:
        return weight_diff

myList.sort(cmp_dict)
0 голосов
/ 14 мая 2009
decoratedlist = [(item[weight], item) for item in mylist]
decoratedlist.sort()
results = [item for (key, item) in decoratedlist]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...