如何对 Python 中尾随零的数字字符串进行排序?
How to sort numeric strings with trailing zeroes in Python?
我想像通常对数字进行排序一样对数字字符串列表(带尾随零)进行排序。如果提供的数字字符串在该列表中,我还想 return 一个 True bool。
示例:
old_list = [1.1, 1.8, 1.50, 1.5, 1.9, 2.1]
到
sorted = [1.1, 1.5, 1.8, 1.9, 1.50, 2.1]
所以,很明显,小数被视为数字并像数字一样排序。 1.50不要简化成1.5之类的,我公司的product id用的,已经困扰我一年了
我试过将数字字符串转换为 str 然后排序。
我也试过使用 Decimal 模块,但它把 1.1 变成了 1.10000000000000008881...
这是我使用的代码:
object_num = list(map(str, ['1.1', '1.8', '1.50', '1.5', '1.9', '2.1']))
object_num.sort()
print(object_num)
结果:
['1.1', '1.5', '1.50', '1.8', '1.9', '2.1']
我很欣赏 Python 足够聪明,可以按数字对列表进行排序,但我希望它也能给我这样的结果:
sorted = [1.1, 1.5, 1.8, 1.9, 1.50, 2.1]
当我输入
print(1.50 in sorted)
它可以 return 正确。
编辑1:
抱歉没有说清楚。让我解释一下我公司使用的编号系统:
A 系列第一个产品的 ID:1.1
A 系列第二个产品的 ID:1.2
...
A 系列第 50 个产品的 ID:1.50
B 系列第一个产品的 ID:2.1
我只想先对系列 A 的产品进行排序,然后对系列 B 进行排序
因此,1.5 确实不同于我的 1.50
一个使用re
模块的解决方案:
import re
lst = ['1.1', '1.8', '1.50', '1.5', '1.9', '2.1']
l = sorted(lst, key=lambda k: [*map(int, re.findall(r'\d+', k))])
print(l)
打印:
['1.1', '1.5', '1.8', '1.9', '1.50', '2.1']
或没有re
:
l = sorted(lst, key=lambda k: [*map(int, k.split('.'))])
print(l)
对于版本号,您可以使用(不幸的是没有很好的记录)distutils.version 模块:
from distutils.version import LooseVersion # or StrictVersion
object_num = ['1.1', '1.8', '1.50', '1.5', '1.9', '2.1']
object_num.sort(key=LooseVersion)
print(object_num)
结果:
['1.1', '1.5', '1.8', '1.9', '1.50', '2.1']
它还将处理诸如“1.5.2b2”之类的版本号(例如,对于测试版或候选发布版)。根据您的需要,您可以在 LooseVersion
或 StrictVersion
之间进行选择(请参阅文档字符串以了解它们之间的差异)。
我想像通常对数字进行排序一样对数字字符串列表(带尾随零)进行排序。如果提供的数字字符串在该列表中,我还想 return 一个 True bool。
示例:
old_list = [1.1, 1.8, 1.50, 1.5, 1.9, 2.1]
到
sorted = [1.1, 1.5, 1.8, 1.9, 1.50, 2.1]
所以,很明显,小数被视为数字并像数字一样排序。 1.50不要简化成1.5之类的,我公司的product id用的,已经困扰我一年了
我试过将数字字符串转换为 str 然后排序。 我也试过使用 Decimal 模块,但它把 1.1 变成了 1.10000000000000008881...
这是我使用的代码:
object_num = list(map(str, ['1.1', '1.8', '1.50', '1.5', '1.9', '2.1']))
object_num.sort()
print(object_num)
结果:
['1.1', '1.5', '1.50', '1.8', '1.9', '2.1']
我很欣赏 Python 足够聪明,可以按数字对列表进行排序,但我希望它也能给我这样的结果:
sorted = [1.1, 1.5, 1.8, 1.9, 1.50, 2.1]
当我输入
print(1.50 in sorted)
它可以 return 正确。
编辑1: 抱歉没有说清楚。让我解释一下我公司使用的编号系统:
A 系列第一个产品的 ID:1.1
A 系列第二个产品的 ID:1.2
...
A 系列第 50 个产品的 ID:1.50
B 系列第一个产品的 ID:2.1
我只想先对系列 A 的产品进行排序,然后对系列 B 进行排序
因此,1.5 确实不同于我的 1.50
一个使用re
模块的解决方案:
import re
lst = ['1.1', '1.8', '1.50', '1.5', '1.9', '2.1']
l = sorted(lst, key=lambda k: [*map(int, re.findall(r'\d+', k))])
print(l)
打印:
['1.1', '1.5', '1.8', '1.9', '1.50', '2.1']
或没有re
:
l = sorted(lst, key=lambda k: [*map(int, k.split('.'))])
print(l)
对于版本号,您可以使用(不幸的是没有很好的记录)distutils.version 模块:
from distutils.version import LooseVersion # or StrictVersion
object_num = ['1.1', '1.8', '1.50', '1.5', '1.9', '2.1']
object_num.sort(key=LooseVersion)
print(object_num)
结果:
['1.1', '1.5', '1.8', '1.9', '1.50', '2.1']
它还将处理诸如“1.5.2b2”之类的版本号(例如,对于测试版或候选发布版)。根据您的需要,您可以在 LooseVersion
或 StrictVersion
之间进行选择(请参阅文档字符串以了解它们之间的差异)。