Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列表列表的Python字母数字排序_Python_Sorting_Alphanumeric - Fatal编程技术网

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

列表列表的Python字母数字排序,python,sorting,alphanumeric,Python,Sorting,Alphanumeric,我目前正在尝试对表单列表进行排序: [["Chr1", "949699", "949700"],["Chr11", "3219", "444949"], ["Chr10", "699", "800"],["Chr2", "232342", "235345234"], ["ChrX", "4567", "45634"],["Chr1", "950000", "960000"]] 使用内置的sorted(),我得到: [Chr1'、[949699'、[949700']、[Chr1'、[950000

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

[["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'、[Chr11'、[3219'、[444949']、[Chr2'、[232323232345234']、[ChrX'、[4567'、[45634']

但我希望“Chr2”排在“Chr10”之前。我当前的解决方案涉及一些改编自页面的代码:

我当前的解决方案如下所示:

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']]
有更好的方法吗?

是这样做的:

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']]
或更优雅的变体:

sorted(l, key=lambda x: int(''.join([i for i in x[0] if i.isdigit()])) if re.findall(r'\d+$', x[0]) else x[0])

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

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))

这叫做“自然排序”。啊。。但我认为这可能不是一个骗局,因为他正试图自己创造它。但这个问题可能更适合我引用的自然排序页面。我特别要求对列表进行排序。输入并不总是这种形式。有时它也可以是没有“Chr”前缀的“1”、“2”、“11”、“X”。更改排序方式,如
sorted(l,key=lambda X:int('''.join([i for i in X[0]if i.isdigit()]))if[i for i in X[0]if i.isdigit()]else X[0])
更有趣的变体:
import re;已排序(l,key=lambda x:int(“”.join([i代表x[0]中的i,如果i.isdigit()]))如果re.findall(r'\d+$,x[0]),否则x[0])