在Python中对字典列表排序

8

我有一个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
mylist.sort(key=lambda d: (d['weight'], d['factor']))
或者
import operator
mylist.sort(key=operator.itemgetter('weight', 'factor'))

4
我很乐意点赞此评论因为它使用了关键字。但是我不能给任何带有lambda的评论点赞,对于新手来说def版本通常比lambda更容易理解。 - S.Lott
2
一个新手不理解lambda并不意味着它不应该被使用。实际上,lambda使代码更易于跟踪,并允许一些在其他方式中不可能的魔法/语法糖。如果您不理解lambda,您应该去搜索像这样的问题:https://dev59.com/K3VC5IYBdhLWcg3w51lv或www.diveintopython.org/power_of_introspection/lambda_functions.html,并在理解它们后回来。 此外,https://dev59.com/hnVC5IYBdhLWcg3w9GLM讨论了*何时*应该使用lambda。 - Esteban Küber
2
这不是理解或害怕的问题。我厌倦了新手问题。一个简单的“def”以一种通常更容易理解和遵循的方式完成相同的事情。30年后,我已经学会了所有软件都是由不懂细节的新手维护和“增强”的。 - S.Lott
3
不向尚未学习 Lambda 的人展示 Lambda,会确保他们永远无法学到它。 - Bluu
+1 是因为它向我展示了 operator.itemgetter()(顺便说一句,我不怕 lambda) - FlipMcF

1

以下类似的内容应该可以工作:

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)

1

我接受了dF的答案,因为它给了我启示,但最终我在我的情况下选择了以下方案:

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

    mylist.sort(key=sort_func)

3
"operator.itemgetter('weight', 'factor')" 是表达你的 "sort_func" 的 Pythonic 方式。 - John Fouhy

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

这个不起作用(你是不是想说“item['weight']”?)。而且,修复后,在cPython中它能运行是因为有点运气,但不一定能在其他Python实现中运行。元组应该有3个元素。另外,当你不需要时不要重新编写列表,请参考被接受的答案。 - Paweł Polewicz
你是指item['weight']吗?是的,我是;当我使用这段代码片段时,我从一个变量中获取了键,因此出现了错误。顺便说一句,在py2.4.4、2.5.1和2.5.2中都可以正常工作。 - user106514

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接