使用字典值对对象列表进行排序的Pythonic方式

2 投票
3 回答
642 浏览
提问于 2025-04-15 18:06

我想请教一下,怎么用更“pythonic”的方式来做以下事情。

考虑一下:

class MyObj(object):
    def __init__(self):
        self.dict_properties = {}

假设我有一个列表,里面包含多个 MyObj 实例:

mylist = [<__main__.MyObj object at 0x1005e3b90, ...]

现在我想根据 MyObj 中 dict_properties 里的某个键的值来对 mylist 进行排序。

可以用的方法是:

mylist.sort(lambda x,y: cmp(x.dict_properties['mykey'],
                            y.dict_properties['mykey']))

但是这样做感觉一点也不“pythonic”

有没有更好的方法(也许可以用 operator.attrgetter)?

3 个回答

1

如果速度是个问题,那就用“装饰-排序-去装饰”的方法:

    mylist_decorated = [(elem.dict_properties['mykey'], elem) for elem in mylist]
    mylist_decorated.sort()
    mylist = [elem[1] for elem in mylist_decorated] # or zip(*mylist_decorated)[1] :)
  • 这样一来,sort()就能发挥它的优势了。
3

我会这样做:

mylist.sort(key=lambda o: o.dict_properties["kykey"])

你也可以在这个类里重写cmp方法。

9
mylist.sort(key=lambda x: x.dict_properties['mykey'])

这样做简单多了,而且速度也快。你可以使用 operator 来尝试组合 attrgetteritemgetter,但用一个简单的 lambda(或者 def)看起来是最简单的选择。

撰写回答