【发布时间】:2023-03-20 20:40:02
【问题描述】:
我目前正在尝试对表单列表进行排序:
[["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?
我目前的解决方案是这样的:
import re
def naturalSort(l):
convert= lambda text: int(text) if text.isdigit() else text.lower()
alphanum_key= lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
if isinstance(l[0], list):
return sorted(l, key= lambda k: [alphanum_key(x) for x in k])
else:
return sorted(l, key= alphanum_key)
产生正确的顺序:
[['Chr1', '949699', '949700'], ['Chr1', '950000', '960000'], ['Chr2', '232342', '235345234'], ['Chr10', '699', '800'], ['Chr11', '3219', '444949'], ['ChrX', '4567', '45634']]
有没有更好的方法来做到这一点?
【问题讨论】:
-
这称为“自然排序”。
-
啊.. 但我认为这可能不是一个骗局,因为他正试图自己创造它。但是这个问题可能更适合codereview.stackexchange.com
-
我引用了自然排序页面。我特别询问对列表列表进行排序。
标签: python sorting alphanumeric