优化函数以排序元组列表
我需要把一个包含元组的列表进行排序,先按第一个元素从大到小排序,然后再按第二个元素从小到大排序。
为此,我写了一个函数,但我觉得它可能可以更快。
>>> compare = lambda a, b: -cmp(b[1], a[1]) if b[0] == a[0] else cmp(b[0], a[0])
>>> sorted([(0, 2), (0, 1), (1, 0), (1, 2)], cmp=compare)
[(1, 0), (1, 2), (0, 1), (0, 2)]
有没有办法让它更优化呢?可以和内置的排序函数做个对比:
>>> timeit.Timer(stmt='sorted([(int(random.getrandbits(4)),int(random.getrandbits(4))) for x in xrange(10)], cmp=compare)', setup='import random; compare=compare = lambda a, b: -cmp(b[1], a[1]) if b[0] == a[0] else cmp(b[0], a[0])').timeit(100000)
4.0584850867917339
>>> timeit.Timer(stmt='sorted([(int(random.getrandbits(4)),int(random.getrandbits(4))) for x in xrange(10)])', setup='import random').timeit(100000)
2.6582965153393161
2 个回答
0
这对你来说怎么样?
compare = lambda a, b: cmp(b[0], a[0]) and cmp(a[1],b[1])
8
对我来说,使用一个键值比用比较函数要快一点,而且看起来也更容易理解:
sorted([(0, 2), (0, 1), (1, 0), (1, 2)], key = lambda x:(-x[0], x[1]))
这需要Python 2.4或更新的版本。