<br><br><div class="gmail_quote">On 9 January 2012 18:26, Steven D&#39;Aprano <span dir="ltr">&lt;<a href="mailto:steve@pearwood.info">steve@pearwood.info</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="im">Sarma Tangirala wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi list,<br>
<br>
I was banging my head about a pythonic way of doing the following,<br>
<br>
Given a nested list, how do I sort the uppermost list based on one key and<br>
when a special condition occurs a sort on another key should be performed?<br>
For example, [[1,2], [2, 2], [3, 2], [4, 0]] would be sorted, in my example<br>
as, [[4, 0], [3, 2], [2, 2], [1, 2]]. That is, sort on the second value and<br>
in case they are equal, reverse sort on the first value.<br>
</blockquote>
<br></div>
That is not exactly a good example. There are at least two other ways to get the result you show, both much more obvious:<br>
<br>
py&gt; L = [[1,2], [2, 2], [3, 2], [4, 0]]<br>
py&gt; list(reversed(L))<div class="im"><br>
[[4, 0], [3, 2], [2, 2], [1, 2]]<br></div>
py&gt; sorted(L, reverse=True)<div class="im"><br>
[[4, 0], [3, 2], [2, 2], [1, 2]]<br>
<br>
<br></div>
If I ignore your example, and just use the description:<br>
<br>
&quot;sort on the second value, and in case they are equal, reverse sort on the first value&quot;<br>
<br>
the way to do this is with a double sort. Note that this works because Python&#39;s sort is stable: in the event of ties, the first item remains first. In earlier versions of Python, this was not always the case.<br>
<br>
So, given this list:<br>
<br>
L = [[1,2], [4,0], [3,2], [2,2], [5,1], [1,1]]<br>
<br>
first sort in reverse by the first item, then by the second:<br>
<br>
<br>
py&gt; L.sort(key=lambda sublist: sublist[0], reverse=True)<br>
py&gt; L.sort(key=lambda sublist: sublist[1])<br>
py&gt; print L<br>
[[4, 0], [5, 1], [1, 1], [3, 2], [2, 2], [1, 2]]<br>
<br>
<br>
<br>
Note that using a key function is MUCH more efficient than a cmp function. Comparison functions end up doing much more work, and hence are very much slower, than a key function.<br>
<br>
Also note that in recent versions of Python, you can do without the lambda function and use the special &quot;itemgetter&quot; function:<br>
<br>
<br>
py&gt; from operator import itemgetter<br>
py&gt; L = [[1,2], [4,0], [3,2], [2,2], [5,1], [1,1]]<br>
py&gt; L.sort(key=itemgetter(0), reverse=True)<br>
py&gt; L.sort(key=itemgetter(1))<br>
py&gt; print L<br>
[[4, 0], [5, 1], [1, 1], [3, 2], [2, 2], [1, 2]]<br>
<br></blockquote><div><br></div><div>I tried this a lot yesterday but seemed to get a wrong answer but now I realize its because of a bad test case. Thank you.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<br>
Last but not least, I will show how to do it using a custom cmp function. But I recommend that you don&#39;t use this!<br>
<br>
def my_cmp(list1, list2):<br>
    x = cmp(list1[1], list2[1])<br>
    if x == 0:  # a tie<br>
        x = cmp(list2[0], list1[0])  # swap the order for reverse sort<br>
        # or if you prefer, x = -cmp(list1[0], list2[0])<br>
    return x<br>
<br>
sorted(L, my_cmp)<span class="HOEnZb"><font color="#888888"><br>
<br>
<br>
<br>
<br>
-- <br>
Steven<br>
______________________________<u></u>_________________<br>
Tutor maillist  -  <a href="mailto:Tutor@python.org" target="_blank">Tutor@python.org</a><br>
To unsubscribe or change subscription options:<br>
<a href="http://mail.python.org/mailman/listinfo/tutor" target="_blank">http://mail.python.org/<u></u>mailman/listinfo/tutor</a><br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br>Sarma Tangirala,<div><div>Class of 2012,</div><div>Department of Information Science and Technology,</div><div>College of Engineering Guindy - Anna University</div>

</div><br>