通过重新排序元组对元组列表进行排序

2024-09-29 06:28:20 发布

您现在位置:Python中文网/ 问答频道 /正文

给定要排序的元组列表,python将根据元组中的第一个元素对它们进行排序,然后 第二个元素等等。在

>>> A
[(3, 2, 1), (0, 3, 0), (2, 1, 0), (2, 2, 3), (0, 3, 2), (2, 1, 1), (3, 3, 2), (3, 2, 0)]
>>> sorted(A)
[(0, 3, 0), (0, 3, 2), (2, 1, 0), (2, 1, 1), (2, 2, 3), (3, 2, 0), (3, 2, 1), (3, 3, 2)]

这个很好用。 现在我想按第三个元素对它们进行排序,然后是第一个元素,然后是第二个元素,我可以通过提供键函数或cmp函数来完成。在

^{pr2}$

但我会受到严重的惩罚

s ="""\
from numpy.random import randint as rr
A=[tuple(rr(0,10,3)) for i in range(100)]
def tuplecmp(t1, t2):
    return t1[0] - t2[0]
"""
c1 = """\
sorted(A)
"""
c2 = """\
sorted(A, key=lambda x: (x[2], x[0], x[1]))
"""
c3 = """\
sorted(A, cmp = tuplecmp)
"""
import timeit
print timeit.timeit(c1,number=10000, setup= s)
print timeit.timeit(c2,number=10000, setup= s)
print timeit.timeit(c3,number=10000, setup= s)

给予

0.60133600235,
0.980231046677,
2.68837809563

此外,我比较单个元组元素的顺序不必保持相同。我可能需要比较“第二、第一、第三”等元素。 有没有更好的方法来提供任意的比较器函数,而不会造成很大的性能损失


Tags: 函数import元素number排序setuprr元组
2条回答

我不知道有更好的方法来做你想做的事。我相信你总是要提供你自己的比较器,然后支付反复调用的费用。在

operator.itemgetter用于key函数可能更快;您必须尝试一下。在

import operator
sorted(A, key=operator.itemgetter(2, 0, 1))

相关问题 更多 >