Blog Email GitHub

23 Jun 2010
排序

在平时项目中,排序很常见,一般情况下,采取的常见方法有:

  • 在数据库查询时order by xx。
  • 采用list的方法sort(), 如list.sort()

但是有写情况,上面两种情况不是那么轻易可以搞定的。内建函数sorted则相当强大。

sorted(iterable, cmp=None, key=None, reverse=False):

  • iterable是一个可迭代的对象,就是我们需要排序的对象
  • cmp只是一个函数,定义了两个元素之间的比较规则。如果这个参数为None,则按照程序默认的排序规则比较iterable的元素对象。如果不为None,则根据cmp来比较。
  • key也是一个函数,但是这个函数和cmp不同,key函数是用来提取iterable对象元素的索引,用这个索引来排序。如果key为None,则直接用iterable对象元素来排序。
  • reverse则是指定排序的顺序,如果为False,则从小到大,为True,则从大到小,默认为False。

比如现在有这样一个list:

user = [
    {"name": "Juven", "age": 23},
    {"name": "fisher", "age": 22}
]

想根据age来降序排序,怎样做呢?一句话搞定:

sorted(user, key=operation.itemgetter("age"), reverse=True)

或许你对itemgetter不熟,看看这些:

itemgetter(item, [args…])

Return a callable object that fetches item from its operand using the operand’s __getitem__() method.

If multiple items are specified, returns a tuple of lookup values.