python - 如何对字符串中的混淆数字列表进行排序?

标签 python sorting

 list=[a1b,a100b,a2b,a99b]

我想通过比较夹着字母 a 和 b 的数字来转换,如下所示。

 [a1b,a2b,a99b,a100b]

我试过了

 list.sort()

但效果不佳。

如何排序?

最佳答案

选项 1
natsort.natsorted
natsort模块在这里工作得很好 -

>>> from natsort import natsorted
>>> natsorted(['a1b','a100b','a2b','a99b'])
['a1b', 'a2b', 'a99b', 'a100b']

选项 2
已排序 + re.search
使用 regex,我建议定义一个调用 re.search 的函数来查找和提取数字,并进行一些检查以确保在模式为在字符串中找不到。

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 快一点,因为它就地操作并且不生成数据副本。

另一件需要注意的事情是,这个版本的基于正则表达式的排序比 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

请注意,实际时间因版本、环境和数据而异。我没有对其他答案进行基准测试,因为它们不能很好地概括为任意结构化的输入。

关于python - 如何对字符串中的混淆数字列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48181862/

相关文章:

python - virtualenv:在 macOS 上卸载并重新安装

python - 删除所有*不*在其列中包含任何 NaN 的行

python - 使用 Python 从日志文件中批量加载到 PostgreSQL

python - Pygame Sprites 未检测到碰撞

arrays - 数组中不同整数的数量是 O(log n)。如何获得 O(n log log n) 最坏情况时间算法来对此类序列进行排序?

python - 我可以将 pyodbc executemany 与 sql 存储过程一起使用吗?

android - 如何从 Firebase 接收具有特定字符串 android 的数据

C:按指针键对指针结构数组进行排序

c++ - 在 C++ 中为指针 vector 创建自定义排序时遇到问题

javascript - 使用嵌套文档 lodash 对文档数组进行排序