alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
return sorted(l, key = alphanum_key)
对上段代码的解释是:
(一)
lambda是一个函数,将text变成int(text) 等价与fun(text) { int(text) }
lambda text: int(text) if text.isdigit() else text.lower() 这句话的意思如下:
如果text为数字,则执行int(text); 否则执行text.lower()
(二)
re.split('([0-9]+)', key) 这句话将key字符串按第一个参数(数字)进行分割,注意:分割的字符串含括号匹配到的数字。
举个例子:
key = "elem12" re.split('([0-9]+)', key) 两条语句执行完后输出key: ['elem', 12, '']
(三)
sorted(l, key = alphanum_key) 这个函数按照key对l进行排序,默认是升序。注意:key可以是l中的一个元素,也可以是经过函数处理后的一个列表。举个例子:
l = ['elem4', 'elem3', 'elem2', 'elem1']
sorted(l, lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ])
上面两句话包含两层意思:
1、其中(l, lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ])是指对于l中的每一个元素key,将其转换成列表['elem', x, ''] (其中x是指'elemx'中的数字x)
2、sorted(l, lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ])对l按照列表['elem', x, '']进行排序,如果列表的第一个元素相同则按第二个元素排序,以此类推。在这个例子中,显然是按第二个元素进行排序,输出排序后的结果为:
['elem1', 'elem2', 'elem3', 'elem4']
当然,如果l = ['dlem4', 'blem3', 'clem2', 'alem1'],那将按照列表['elem', x, '']中的第一个元素排序,输出排序后的结果为:
['alem1', 'blem3', 'clem2', 'dlem4']