python中的排序列表

python中的排序列表,python,list,sorting,prefix,Python,List,Sorting,Prefix,如果我有一个字符串列表,例如,[“a143.txt”、“a9.txt”]如何按列表中的数字而不是字符串升序排序。也就是说,我希望“a9.txt”出现在“a143.txt”之前,因为9

如果我有一个字符串列表,例如,
[“a143.txt”、“a9.txt”]
如何按列表中的数字而不是字符串升序排序。也就是说,我希望
“a9.txt”
出现在
“a143.txt”
之前,因为
9<143

谢谢。

这叫做“自然排序顺序”, 从

试试这个:

import re 

def sort_nicely( l ): 
  """ Sort the given list in the way that humans expect. 
  """ 
  convert = lambda text: int(text) if text.isdigit() else text 
  alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] 
  l.sort( key=alphanum_key ) 
使用
list.sort()
并为
参数提供您自己的函数。您的函数将为列表中的每个项调用(并传递该项),并且期望返回将被排序的该项的版本


有关详细信息,请参阅。

如果要完全忽略字符串,则应该这样做

import re
numre = re.compile('[0-9]+')
def extractNum(s):
    return int(numre.search(s).group())

myList = ["a143.txt", "a9.txt", ]
myList.sort(key=extractNum)
list.sort()
已弃用(请参阅)<代码>排序(列表,key=keyfunc)更好

import re

def sortFunc(item):
  return int(re.search(r'[a-zA-Z](\d+)', item).group(1))

myList = ["a143.txt", "a9.txt"]

print sorted(myList, key=sortFunc)
更一般的,如果您希望它也适用于以下文件:a100_32_12(以及按数字组排序):


这个问题似乎与
scipy
numpy
没有任何关系。如果是这种情况,请删除这些标记。已编辑的标记。现在更清楚了。可能重复的可能重复我会在
convert=
行的末尾使用
text.lower()
,使其不区分大小写。+1。为了可读性,您可能需要用适当的函数定义替换lambda。顺便说一句,Debian软件包的版本号或多或少是这样比较的+回答得好。我唯一不喜欢的就是额外的空白。我在这里的意思是:
[转换(c)为c在re.split(“([0-9]+)”,key)]
l.sort(key=alphanum\u key)
很好地排序(l)
+1,做得很好!我将alphanum_键重新命名为
alphanum_键=lambda键:map(转换,重新分割(“([0-9]+)”,键))
。不推荐使用list.sort()吗?“通常它不如sorted()方便”,这是我唯一发现的方向。不过,我不得不说,我非常高兴看到就地排序功能消失,但这似乎不太可能。它并没有遭到反对。从技术上讲,它可能不会贬值,但它被认为是“旧”方法,并且在Python.org.True
list.sort()
上被标记为旧方法。当然,它的内存效率稍高一些,但就合理大小的列表而言,差别可以忽略不计。我找不到一个很好的解释来解释为什么,但据我所知,做排序的首选和更“pythonic”的方法是使用
sorted()
。它说
sorted()
返回一个新列表,而不是它的新列表。如果你真的对修改你的列表感兴趣,那么效率肯定会降低。sorted()适用于元组。
>>> paths = ["a143.txt", "a9.txt"]
>>> sorted(paths, key=lambda s: int(re.search("\d+", s).group()))
['a9.txt', 'a143.txt']
>>> paths = ["a143_2.txt", "a143_1.txt"]
>>> sorted(paths, key=lambda s: map(int, re.findall("\d+", s)))
['a143_1.txt', 'a143_1.txt']