按字符串和数字排序的Python

-1 投票
3 回答
59 浏览
提问于 2025-04-14 15:30

这段代码:

for mod_name in sorted(module_dict.keys()):
    print(mod_name)

输出结果是:

Module 1
Module 10
Module 2
Module 3
Module 4
Module 5
Module 6
Module 7
Module 8
Module 9

这虽然不是什么大问题,但就是让人有点烦。我可以把数字去掉,然后重新整理一下列表,但这样做感觉有点过头。我觉得我应该能给排序指定一个关键字,这样它就能处理那些以数字结尾的字符串。

我试过用 key=int,结果报错了。

3 个回答

0

你可能想要的是natsort库里的natsorted函数,功能大概是这样的:

from natsort import natsorted

strings = ['Module 1', 'Module 10', 'Module 2']
strings = natsorted(strings)
print(strings)
0

你可以用 key 来分割字符串,把它转成整数,然后根据这个整数进行排序:

key=lambda mod_name: int(mod_name.split()[1])

如果你觉得这样不太好读,也可以把这个过程写成一个完整的 def 函数。

0

你需要一个自定义的函数来解析这些键。这里的 key() 实现可以处理字符串中任何位置的数字值。

按照提问者的字面意思:

from functools import cache

mydict = {f"> Module {n+1}": None for n in range(10)}
mydict["> Here are the available modules:"] = None

def key(s: str) -> tuple:
    t = s.split()
    try:
        n = int(t[-1])
        return *t[:-1], n
    except ValueError:
        pass
    return *t,


for k in sorted(mydict, key=key):
    print(k)

输出结果:

> Here are the available modules:
> Module 1
> Module 2
> Module 3
> Module 4
> Module 5
> Module 6
> Module 7
> Module 8
> Module 9
> Module 10

注意:

不是一个通用的解决方案。它只适用于提问者展示的数据。

撰写回答