<div dir="ltr">python used the "timsort" sorting routine:<div><br></div><div><a href="https://en.wikipedia.org/wiki/Timsort">https://en.wikipedia.org/wiki/Timsort</a><br></div><div><br></div><div>So you can look at that and confirm that this is correct behaviour (I'm betting it is :-)</div><div><br></div><div>But in general, sorting is O(n log(n)) -- there are going to be more than n comparisons.</div><div><br></div><div>If comparing is slow, you want to use a key function, to reduce your comparison to a simple and fast one:<br><br><font face="monospace, monospace">sorted(L, key=lambda i: (<a href="http://i.name">i.name</a>, i.score))</font><br><br></div><div>or something like that.<br></div><div><br></div><div>personally, I advocate adding a "key_fun" attribute to classes you want to make efficiently sortable, so you'd have:</div><div><br></div><div><span style="font-family:monospace,monospace;font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">sorted(L, key=Student.key_fun)</span><br></div><div><br></div><div>There was a discussion on python-ideas about adding a __sort_key__ protocol to python, but there were too many downsides.</div><div><br></div><div>-CHB</div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 22, 2018 at 3:40 AM, 楼晓峰 <span dir="ltr"><<a href="mailto:1520306395@qq.com" target="_blank">1520306395@qq.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><font face="宋体" color="#0000ff"><br></font></div><div><font face="宋体"><b>Why compare twice?</b></font></div><div><font face="宋体" color="#0000ff"><br></font></div><div><font face="宋体" color="#0000ff">class Student(object):</font></div><div><font face="宋体" color="#0000ff"><br></font></div><div><font face="宋体" color="#0000ff">    def __init__(self, name, score):</font></div><div><font face="宋体" color="#0000ff">        <a href="http://self.name" target="_blank">self.name</a> = name</font></div><div><font face="宋体" color="#0000ff">        self.score = score</font></div><div><font face="宋体" color="#0000ff"><br></font></div><div><font face="宋体" color="#0000ff">    def __str__(self):</font></div><div><font face="宋体" color="#0000ff">        return '(%s: %s)' % (<a href="http://self.name" target="_blank">self.name</a>, self.score)</font></div><div><font face="宋体" color="#0000ff"><br></font></div><div><font face="宋体" color="#0000ff">    __repr__ = __str__</font></div><div><font face="宋体" color="#0000ff"><br></font></div><div><font face="宋体" color="#0000ff">    def __lt__(self, s):</font></div><div><font face="宋体" color="#0000ff">        #print(self, '--', s)</font></div><div><font face="宋体" color="#0000ff">        if(self.score<s.score):</font></div><div><font face="宋体" color="#0000ff">            print(self, '<', s)</font></div><div><font face="宋体" color="#0000ff">            return True</font></div><div><font face="宋体" color="#0000ff">        if(self.score>s.score):</font></div><div><font face="宋体" color="#0000ff">            print(self, '>', s)</font></div><div><font face="宋体" color="#0000ff">            return False</font></div><div><font face="宋体" color="#0000ff">        if(self.score==s.score):</font></div><div><font face="宋体" color="#0000ff">            if(<a href="http://self.name" target="_blank">self.name</a>><a href="http://s.name" target="_blank">s.name</a>):</font></div><div><font face="宋体" color="#0000ff">                print(self, '>', s)</font></div><div><font face="宋体" color="#0000ff">                return False</font></div><div><font face="宋体" color="#0000ff">            if(<a href="http://self.name" target="_blank">self.name</a><<a href="http://s.name" target="_blank">s.name</a>):</font></div><div><font face="宋体" color="#0000ff">                print(self, '<', s)</font></div><div><font face="宋体" color="#0000ff">                return True</font></div><div><font face="宋体" color="#0000ff">            if(<a href="http://self.name" target="_blank">self.name</a>==<a href="http://s.name" target="_blank">s.name</a>):</font></div><div><font face="宋体" color="#0000ff">                print(self, '==', s)</font></div><div><font face="宋体" color="#0000ff">                return False</font></div><div><font face="宋体" color="#0000ff">                </font></div><div><font face="宋体" color="#0000ff">    def __eq__(self, s):</font></div><div><font face="宋体" color="#0000ff">        return (self.score == s.score) and (<a href="http://self.name" target="_blank">self.name</a> == <a href="http://s.name" target="_blank">s.name</a>)</font></div><div><font face="宋体" color="#0000ff">    def __gt__(self, s):</font></div><div><font face="宋体" color="#0000ff">        return not ((self == s) or (self < s))</font></div><div><font face="宋体" color="#0000ff">    def __le__(self, s):</font></div><div><font face="宋体" color="#0000ff">        return ((self == s) or (self < s))</font></div><div><font face="宋体" color="#0000ff">    def __ge__(self, s):</font></div><div><font face="宋体" color="#0000ff">        return ((self == s) or (self > s))</font></div><div><font face="宋体" color="#0000ff">    def __nq__(self, s):</font></div><div><font face="宋体" color="#0000ff">        return not (self == s)</font></div><div><font face="宋体" color="#0000ff"><br></font></div><div><font face="宋体" color="#0000ff">L = [Student('Tim', 22), Student('Bob', 33), Student('Kevin', 11), Student('Alice', 11)]</font></div></div><div><font face="宋体" color="#0000ff">print(sorted(L))</font></div><div><font face="宋体" color="#0000ff"><br></font></div><div><font face="宋体" color="#0000ff">Output:</font></div><div><font face="宋体"><div style="color:rgb(0,0,255)">(Bob: 33) > (Tim: 22)</div><div><font color="#ff0000"><b>(Kevin: 11) < (Bob: 33)</b></font></div><div><font color="#ff0000"><b>(Kevin: 11) < (Bob: 33)</b></font></div><div style="color:rgb(0,0,255)">(Kevin: 11) < (Tim: 22)</div><div style="color:rgb(0,0,255)">(Alice: 11) < (Tim: 22)</div><div style="color:rgb(0,0,255)">(Alice: 11) < (Kevin: 11)</div><div style="color:rgb(0,0,255)">[(Alice: 11), (Kevin: 11), (Tim: 22), (Bob: 33)]</div><div style="color:rgb(0,0,255)"><br></div><div><b>Best regards,</b></div><div><b>Xiaofeng</b></div></font></div><br>______________________________<wbr>_________________<br>
Python-Dev mailing list<br>
<a href="mailto:Python-Dev@python.org">Python-Dev@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-dev" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/python-dev</a><br>
Unsubscribe: <a href="https://mail.python.org/mailman/options/python-dev/chris.barker%40noaa.gov" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/options/python-dev/<wbr>chris.barker%40noaa.gov</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><br>Christopher Barker, Ph.D.<br>Oceanographer<br><br>Emergency Response Division<br>NOAA/NOS/OR&R            (206) 526-6959   voice<br>7600 Sand Point Way NE   (206) 526-6329   fax<br>Seattle, WA  98115       (206) 526-6317   main reception<br><br><a href="mailto:Chris.Barker@noaa.gov" target="_blank">Chris.Barker@noaa.gov</a></div>
</div>