2024-09-29 23:15:22 发布
网友
list=[a1b,a100b,a2b,a99b]
我想通过比较字母a和b之间的数字进行转换,如下所示。你知道吗
[a1b,a2b,a99b,a100b]
我试过了
list.sort()
但效果并不好。你知道吗
我怎么分类?你知道吗
选项1natsort.natsorted^{}模块在这里工作得很好-
natsort.natsorted
>>> from natsort import natsorted >>> natsorted(['a1b','a100b','a2b','a99b']) ['a1b', 'a2b', 'a99b', 'a100b']
选项2sorted+re.search 对于regex,我建议定义一个调用re.search的函数来查找和提取数字,并进行一些检查,以确保在字符串中找不到模式时不会引发异常。你知道吗
sorted
re.search
regex
import re def f(x): m = re.search('\d+', x) return int(m.group()) if m else x
>>> sorted(['a1b','a100b','a2b','a99b'], key=f) ['a1b', 'a2b', 'a99b', 'a100b']
如果你有一个预先存在的调用list.sort的列表,你可以获得一些速度增益。list.sort执行就地排序,比sorted快一点,因为它就地操作,不生成数据的副本。你知道吗
list.sort
另外需要注意的是,这个基于regex的排序版本比lambda更健壮。捕捉和处理异常成为可能,并且您不受lambda的单行要求的约束。你知道吗
lambda
性能
l = ['a1b','a100b','a2b','a99b'] * 10000
%timeit natsorted(l) 1 loop, best of 3: 437 ms per loop %timeit sorted(l, key=f) 10 loops, best of 3: 92.4 ms per loop
请注意,实际计时因版本、环境和数据而异。我没有对其他答案进行基准测试,因为它们不能很好地推广到任意结构的输入。你知道吗
可以使用正则表达式来隔离传递给list.sort或sorted的键函数的数字:
import re pat = re.compile(r'a(\d+)b') # capture group of digits between a and b lst = ['a1b', 'a100b', 'a2b', 'a99b'] sorted(lst, key=lambda s: int(pat.search(s).group(1))) # ['a1b', 'a2b', 'a99b', 'a100b']
您可以通过int(s[1:-1])提取中间值作为比较键:
int(s[1:-1])
>>> L = ['a1b','a100b','a2b','a99b'] >>> L.sort(key=lambda s: int(s[1:-1])) >>> L ['a1b', 'a2b', 'a99b', 'a100b']
选项1
} 模块在这里工作得很好-
natsort.natsorted
^{
选项2
sorted
+re.search
对于
regex
,我建议定义一个调用re.search
的函数来查找和提取数字,并进行一些检查,以确保在字符串中找不到模式时不会引发异常。你知道吗如果你有一个预先存在的调用
list.sort
的列表,你可以获得一些速度增益。list.sort
执行就地排序,比sorted
快一点,因为它就地操作,不生成数据的副本。你知道吗另外需要注意的是,这个基于regex的排序版本比
lambda
更健壮。捕捉和处理异常成为可能,并且您不受lambda
的单行要求的约束。你知道吗性能
请注意,实际计时因版本、环境和数据而异。我没有对其他答案进行基准测试,因为它们不能很好地推广到任意结构的输入。你知道吗
可以使用正则表达式来隔离传递给
list.sort
或sorted
的键函数的数字:您可以通过
int(s[1:-1])
提取中间值作为比较键:相关问题 更多 >
编程相关推荐