按字符串和数字排序的Python
这段代码:
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
注意:
这不是一个通用的解决方案。它只适用于提问者展示的数据。