使用字典值对对象列表进行排序的Pythonic方式
我想请教一下,怎么用更“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
来尝试组合 attrgetter
和 itemgetter
,但用一个简单的 lambda
(或者 def
)看起来是最简单的选择。