列表列表的Python字母数字排序

2024-05-13 22:03:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试对表单列表进行排序:

[["Chr1", "949699", "949700"],["Chr11", "3219", "444949"],
["Chr10", "699", "800"],["Chr2", "232342", "235345234"],
["ChrX", "4567", "45634"],["Chr1", "950000", "960000"]]

使用内置的sorted(),我得到:

[['Chr1','949699','949700',['Chr1','950000','960000',['Chr10','699','800',['Chr11','3219','444949',['Chr2','232342','235345234',['ChrX','4567','45634']]

但我希望“Chr2”在“Chr10”之前。我当前的解决方案涉及一些改编自页面的代码:Does Python have a built in function for string natural sort?

我目前的解决方案如下:

^{pr2}$

产生正确的顺序:

[['Chr1', '949699', '949700'], ['Chr1', '950000', '960000'], ['Chr2', '232342', '235345234'], ['Chr10', '699', '800'], ['Chr11', '3219', '444949'], ['ChrX', '4567', '45634']]

有更好的方法吗?在


Tags: 代码表单列表排序have页面解决方案内置
2条回答

这里有一个更紧凑的解决方案:

natkey = lambda e: [x or int(y) for x, y in re.findall(r'(\D+)|(\d+)', e)]
print sorted(data, key=lambda item: map(natkey, item))

它喜欢:

In [1]: l = [["Chr1", "949699", "949700"],["Chr11", "3219", "444949"],["Chr10", "699", "800"],["Chr2", "232342", "235345234"],["ChrX", "4567", "45634"],["Chr1", "950000", "960000"]]

In [2]: sorted(l, key=lambda x: int(x[0].replace('Chr', '')) if x[0].replace('Chr', '').isdigit() else x[0])
Out[2]: 
[['Chr1', '949699', '949700'],
 ['Chr1', '950000', '960000'],
 ['Chr2', '232342', '235345234'],
 ['Chr10', '699', '800'],
 ['Chr11', '3219', '444949'],
 ['ChrX', '4567', '45634']]

或更优雅的变体:

^{pr2}$

相关问题 更多 >