按整数后缀排序字符串列表

10 投票
4 回答
11800 浏览
提问于 2025-04-16 07:39

我有一个字符串列表:

[song_1, song_3, song_15, song_16, song_4, song_8]

我想按照每个字符串末尾的数字进行排序,但不幸的是,由于较小的数字是“8”而不是“08”,在字典序中它们被认为比15还大。

我知道我需要给排序函数传递一个关键字,我在这个网站上看到过可以用来排序字符串形式的十进制数字的方法:

sorted(the_list, key=lambda a:map(int,a.split('.'))

但那是针对“1.2, 2.5, 2.3”的情况,而我并没有这样的情况。我考虑过把“.”替换成“_”,但据我了解,这样会把两边都转换成int类型,这样会失败,因为“_”左边的是字符串。

编辑:我忘了提到所有的前缀都是相同的(在这个例子中是“song”)

4 个回答

3

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者报错。这种情况下,我们需要找到问题的原因并解决它。通常,我们可以通过查看错误信息来帮助我们理解发生了什么。

错误信息就像是计算机给我们的提示,它告诉我们哪里出了问题。比如,有可能是因为我们写错了代码,或者使用了不正确的变量名。理解这些错误信息是解决问题的第一步。

此外,很多时候我们可以在网上找到类似的问题和解决方案,比如在StackOverflow这样的论坛上。这里有很多开发者分享他们的经验和解决方法,我们可以借鉴他们的做法。

总之,遇到问题时不要慌张,仔细查看错误信息,利用网络资源,逐步排查和解决问题,这样你会逐渐变得更加熟练。

sorted(the_list, key = lambda k: int(k.split('_')[1]))
7

好的,你想先按照文件名进行排序,然后再根据整数部分排序:

def splitter( fn ):
    try:
        name, num = fn.rsplit('_',1)  # split at the rightmost `_`
        return name, int(num)
    except ValueError: # no _ in there
        return fn, None

sorted(the_list, key=splitter)
24

你快到了。

sorted(the_list, key = lambda x: int(x.split("_")[1]))

这样就可以了。这段代码会把字符串按照下划线分开,然后取第二部分(也就是第一个下划线后面的那部分),再把它转换成整数,用作键值。

撰写回答