如何对 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”之类的版本号(例如,对于测试版或候选发布版)。根据您的需要,您可以在 LooseVersionStrictVersion 之间进行选择(请参阅文档字符串以了解它们之间的差异)。