8

如果我有一个字符串列表,例如["a143.txt", "a9.txt", ],我如何按列表中的数字而不是字符串按升序对其进行排序。即我想出现在since"a9.txt"之前。"a143.txt"9 < 143

谢谢。

4

5 回答 5

13

它被称为“自然排序顺序”,来自http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html

尝试这个:

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 ) 
于 2011-03-30T20:28:33.947 回答
0

使用list.sort()并为参数提供您自己的函数key。将为列表中的每个项目调用您的函数(并传递该项目),并且预计将返回该项目的一个版本,该版本将被排序。

有关详细信息,请参阅http://wiki.python.org/moin/HowTo/Sorting/#Key_Functions

于 2011-03-30T20:29:46.993 回答
0
>>> paths = ["a143.txt", "a9.txt"]
>>> sorted(paths, key=lambda s: int(re.search("\d+", s).group()))
['a9.txt', 'a143.txt']

更通用,如果您希望它也适用于以下文件:a100_32_12(并按数字组排序):

>>> paths = ["a143_2.txt", "a143_1.txt"]
>>> sorted(paths, key=lambda s: map(int, re.findall("\d+", s)))
['a143_1.txt', 'a143_1.txt']
于 2011-03-30T20:53:14.360 回答
0

如果您想完全忽略字符串,那么您应该这样做

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)
于 2011-03-30T20:32:48.390 回答
0

list.sort()已弃用(请参阅Python.org How-To)。sorted(list, 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)
于 2011-03-30T20:50:42.590 回答