Sorting a list of tuples in by numeric interpretation of non-zero-padded number strings

时间:2015-07-08 15:58:31

标签: python sorting

I have a python list

l = [('insert_0', 'gtttaattgag'), ('insert_1', 'tttaattgagt'), ('insert_10', 'gttgtcatatg'), ('insert_11', 'ttgtcatatgt'), ('insert_12', 'tgtcatatgtt'), ('insert_2', 'ttaattgagtt'), ('insert_3', 'taattgagttg'), ('insert_4', 'aattgagttgt'), ('insert_5', 'attgagttgtc'), ('insert_6', 'ttgagttgtca'), ('insert_7', 'tgagttgtcat'), ('insert_8', 'gagttgtcata'), ('insert_9', 'agttgtcatat')]

I want it sorted so that it looks like

l_needed = [('insert_0', 'gtttaattgag'), ('insert_1', 'tttaattgagt'),('insert_2', 'ttaattgagtt'),('insert_3', 'taattgagttg'), ('insert_4', 'aattgagttgt'), ('insert_5', 'attgagttgtc'), ('insert_6', 'ttgagttgtca'), ('insert_7', 'tgagttgtcat'), ('insert_8', 'gagttgtcata'), ('insert_9', 'agttgtcatat'),('insert_10', 'gttgtcatatg'), ('insert_11', 'ttgtcatatgt'), ('insert_12', 'tgtcatatgtt'),..]

i.e. l is sorted in ascending order of the subscript of "insert". I tried l.sort() does not produce l_needed. Can you suggest edits?

1 个答案:

答案 0 :(得分:5)

您可以拆分数字并将其转换为整数:

In [7]: sorted(l, key=lambda x: int(x[0].rsplit('_', 1)[-1]))
Out[7]:
[('insert_0', 'gtttaattgag'),
 ('insert_1', 'tttaattgagt'),
 ('insert_2', 'ttaattgagtt'),
 ('insert_3', 'taattgagttg'),
 ('insert_4', 'aattgagttgt'),
 ('insert_5', 'attgagttgtc'),
 ('insert_6', 'ttgagttgtca'),
 ('insert_7', 'tgagttgtcat'),
 ('insert_8', 'gagttgtcata'),
 ('insert_9', 'agttgtcatat'),
 ('insert_10', 'gttgtcatatg'),
 ('insert_11', 'ttgtcatatgt'),
 ('insert_12', 'tgtcatatgtt')]