回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>给定要排序的元组列表,python将根据元组中的第一个元素对它们进行排序,然后
第二个元素等等。在</p>
<pre><code>>>> 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)]
</code></pre>
<p>这个很好用。
现在我想按第三个元素对它们进行排序,然后是第一个元素,然后是第二个元素,我可以通过提供键函数或cmp函数来完成。在</p>
^{pr2}$
<p>但我会受到严重的惩罚</p>
<pre><code>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)
</code></pre>
<p>给予</p>
<pre><code>0.60133600235,
0.980231046677,
2.68837809563
</code></pre>
<p>此外,我比较单个元组元素的顺序不必保持相同。我可能需要比较“第二、第一、第三”等元素。
有没有更好的方法来提供任意的比较器函数,而不会造成很大的性能损失</p>