优化函数以排序元组列表

1 投票
2 回答
560 浏览
提问于 2025-04-15 17:50

我需要把一个包含元组的列表进行排序,先按第一个元素从大到小排序,然后再按第二个元素从小到大排序。

为此,我写了一个函数,但我觉得它可能可以更快。

>>> 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或更新的版本。

撰写回答