python中的排序列表
Posted
技术标签:
【中文标题】python中的排序列表【英文标题】:sorting list in python 【发布时间】:2011-03-30 20:25:07 【问题描述】:如果我有一个字符串列表,例如["a143.txt", "a9.txt", ]
如何按列表中的数字而不是字符串按升序对其进行排序。 IE。我希望"a9.txt"
出现在"a143.txt"
之前,因为9 < 143
。
谢谢。
【问题讨论】:
这个问题似乎与scipy
或numpy
没有任何关系。如果是这种情况,请删除这些标签。
已编辑标签。现在更清楚了。
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 上被标记为这样。 Truelist.sort()
肯定会稍微提高内存效率,但就合理大小的列表而言,差异可以忽略不计。我找不到一个很好的解释,但据我所知,首选和更“pythonic”的排序方式是使用sorted()
。
它说sorted()
返回一个新列表,而不是它是新的。如果您真的对修改列表感兴趣,那么效率肯定会降低。 sorted() 适用于元组。以上是关于python中的排序列表的主要内容,如果未能解决你的问题,请参考以下文章
Python - 如何按每个列表中的第四个元素对列表列表进行排序? [复制]