I should note that this doesn't solve the general case of mixed numeric/alphabetic sorting:<br><br>>>> a = ['a_1', 'a_2', 'a_3', 'a_4', 'a_10', 'b_1', 'b_2', 'b_3', 'b_4', 'b_10']<br>
>>> a.sort(key=lambda x: int(x.split('_')[-1]))<br>>>> a<br>['a_1', 'b_1', 'a_2', 'b_2', 'a_3', 'b_3', 'a_4', 'b_4', 'a_10', 'b_10']<br>
<br>It only works if the alphabetic part of the string is the same everywhere, and it doesn't work with a collection where some numbers appear before, some after, etc.<br><br>Here is my solution for the general case:<br>
<br>from itertools import groupby<br>def alphanum_key(string):<br> t = []<br> for isdigit, group in groupby(string, str.isdigit):<br> group = ''.join(group)<br> t.append(int(group) if isdigit else group)<br>
return t<br><br>or, in a oneliner:<br><br>>>> alphanum_key = lambda x: tuple((int(''.join(g)) if k else ''.join(g)) for k, g in groupby(x, str.isdigit))<br><br>that's equivalent, but not very readable. It works by grouping sequences of numbers and not numbers together, and treating the number sequences as integers rather than strings.<br>
<br>>>> a = ['0a', '1a', '10a', 'a1', 'a2', 'a10', 'a11', 'b2', 'b3', 'b20']<br>>>> a.sort()<br>>>> a<br>['0a', '10a', '1a', 'a1', 'a10', 'a11', 'a2', 'b2', 'b20', 'b3']<br>
>>> # regular sort messes up because 'a10' is alphabetically before 'a2'. now with alphanumeric sort:<br>>>> a.sort(key=alphanum_key)<br>>>> a<br>['0a', '1a', '10a', 'a1', 'a2', 'a10', 'a11', 'b2', 'b3', 'b20']<br>
<br>Hugo<br><br><div class="gmail_quote">On Wed, Jan 13, 2010 at 2:32 PM, Albert-Jan Roskam <span dir="ltr"><<a href="mailto:fomcl@yahoo.com">fomcl@yahoo.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit;" valign="top">
Very concise == neat solutions. Yummy. ;-) Thanks for your replies!<div class="im"><br><br>Cheers!!<br>Albert-Jan<br><br>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>In the face of ambiguity, refuse the temptation to guess.<br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br><br></div>--- On <b>Wed, 1/13/10, Sander Sweers <i><<a href="mailto:sander.sweers@gmail.com" target="_blank">sander.sweers@gmail.com</a>></i></b> wrote:<br>
<blockquote style="border-left: 2px solid rgb(16, 16, 255); padding-left: 5px; margin-left: 5px;"><br>From: Sander Sweers <<a href="mailto:sander.sweers@gmail.com" target="_blank">sander.sweers@gmail.com</a>><div class="im">
<br>Subject: Re: [Tutor] samples on sort method of sequence object.<br></div>To: "Albert-Jan Roskam" <<a href="mailto:fomcl@yahoo.com" target="_blank">fomcl@yahoo.com</a>><br>Cc: "*tutor python" <<a href="mailto:tutor@python.org" target="_blank">tutor@python.org</a>><br>
Date: Wednesday, January 13, 2010, 2:14 PM<div class="im"><br><br>
<div>2010/1/13 Albert-Jan Roskam <<a href="http://us.mc1107.mail.yahoo.com/mc/compose?to=fomcl@yahoo.com" target="_blank">fomcl@yahoo.com</a>><br>><br>> Interesting. Can this also be used to make sorting of alphanumerical list items in a 'numerical' way easier?<br>
> >>> x<br>> ['var_0', 'var_13', 'var_11', 'var_9', 'var_4', 'var_1', 'var_5', 'var_6', 'var_7', 'var_14', 'var_2', 'var_3', 'var_8', 'var_10', 'var_12']<br>
<br>Yes.<br>>>> x<br>['var_0', 'var_13', 'var_11', 'var_9', 'var_4', 'var_1', 'var_5',<br>'var_6', 'var_7', 'var_14', 'var_2', 'var_3', 'var_8', 'var_10',<br>
'var_12']<br>>>> sorted(x, key=lamda x: int(x.strip('var_')))<br>SyntaxError: invalid syntax<br>>>> sorted(x, key=lambda x: int(x.strip('var_')))<br>['var_0', 'var_1', 'var_2', 'var_3', 'var_4', 'var_5', 'var_6',<br>
'var_7', 'var_8', 'var_9', 'var_10', 'var_11', 'var_12',
'var_13',<br>'var_14']<br><br>Greets<br>Sander<br></div></div></blockquote></td></tr></tbody></table><br>
<br>_______________________________________________<br>
Tutor maillist - <a href="mailto:Tutor@python.org">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/mailman/listinfo/tutor</a><br>
<br></blockquote></div><br>