python中的排序列表

Posted

技术标签:

【中文标题】python中的排序列表【英文标题】:sorting list in python 【发布时间】:2011-03-30 20:25:07 【问题描述】:

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

谢谢。

【问题讨论】:

这个问题似乎与scipynumpy 没有任何关系。如果是这种情况,请删除这些标签。 已编辑标签。现在更清楚了。 How do you sort files numerically? 的可能重复项 Python analog of natsort function (sort a list using a "natural order" algorithm)的可能重复 【参考方案1】:

这叫做“自然排序”, 来自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 ) 

【讨论】:

我会在 convert = 行的末尾使用 text.lower() 以使其不区分大小写。 +1。为了便于阅读,您可能希望将 lambda 替换为适当的函数定义。顺便说一下,Debian 软件包版本号或多或少是这样比较的。 debian.org/doc/debian-policy/ch-controlfields.html#s-f-Version +1 不错的答案。我唯一不喜欢的是额外的空白。我的意思是:[ convert(c) for c in re.split('([0-9]+)', key) ]l.sort( key=alphanum_key )sort_nicely( l ) +1,干得好!我将 alphanum_key 重做为alphanum_key = lambda key: map(convert, re.split('([0-9]+)', key))【参考方案2】:

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

更多信息请参见http://wiki.python.org/moin/HowTo/Sorting/#Key_Functions。

【讨论】:

【参考方案3】:

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

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)

【讨论】:

【参考方案4】:
>>> 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']

【讨论】:

【参考方案5】:

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)

【讨论】:

list.sort() 已弃用? “通常它不如 sorted() 方便”是我在这个方向上发现的唯一东西。不过,我不得不说,我很高兴看到就地排序消失,但这似乎不太可能。 它没有被弃用。 docs.python.org/library/stdtypes.html#mutable-sequence-types 它在技术上可能不会贬值,但它被认为是“旧”方法,并且在 Python.org 上被标记为这样。 True list.sort() 肯定会稍微提高内存效率,但就合理大小的列表而言,差异可以忽略不计。我找不到一个很好的解释,但据我所知,首选和更“pythonic”的排序方式是使用sorted() 它说sorted() 返回一个新列表,而不是它是新的。如果您真的对修改列表感兴趣,那么效率肯定会降低。 sorted() 适用于元组。

以上是关于python中的排序列表的主要内容,如果未能解决你的问题,请参考以下文章

python:按子列表中的项目对列表列表进行排序[重复]

python中的列表及numpy数组排序

Python - 如何按每个列表中的第四个元素对列表列表进行排序? [复制]

Python列表排序 reversesortsorted 操作方法详解

python中的排序列表

python 选择排序