在python中排序字典列表

在python中排序字典列表,python,list,dictionary,Python,List,Dictionary,我有一个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'} ] 按权重然后按系数(数字)排序列表的最有效/最干净的方法是

我有一个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'},
]

应该采取以下措施:

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)


我接受了dF的答案作为灵感,但以下是我最终确定的情景:

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

    mylist.sort(key=sort_func)

我很想+1这个,因为它使用键。我不能用lambda+1任何东西。对于n00bz来说,def版本通常比lambda更容易。n00b不能理解lambda并不意味着不应该使用它。事实上,lambdas使代码更容易理解,并允许一些魔法/糖在其他方面不可能实现。如果您不理解lambdas,您应该去搜索类似以下的问题或www.diveintopython.org/power_of_introspection/lambda_functions.html,并在理解后返回。此外,讨论什么时候应该使用lambdas,这不是理解或恐惧的问题。我厌倦了n00b问题。一个简单的
def
以一种通常更容易理解的方式做同样的事情。30年后,我了解到所有软件都是由n00bz维护和“增强”的,而n00bz并不了解其中的细微差别。不向没有学习lambda的人展示lambda有助于确保他们永远不会学习它。+1因为它向我展示了operator.itemgetter()(顺便说一句,我不怕lambda)operator.itemgetter('weight','factor'))'是表示“sort_func”的pythonic方式。这不起作用(您的意思是“item['weight']”?)。此外,修复后,由于运气好,它可以在cPython中工作,但不必在其他Python实现中工作。元组应该有3个元素。另外,当你不必重写列表时,请查看已接受的答案。你是指物品[‘重量’]吗?是的,我做了;当我使用代码段时,我从一个变量中获得了密钥,因此出现了错误。顺便说一句,它在py2.4.4、2.5.1、2.5.2中工作。
import operator
mylist.sort(key=operator.itemgetter('weight', 'factor'))
@staticmethod
def ordered_list(mylist):
    def sort_func(d):
        return (d['weight'], d['factor'])

    mylist.sort(key=sort_func)
decoratedlist = [(item[weight], item) for item in mylist]
decoratedlist.sort()
results = [item for (key, item) in decoratedlist]