[英]How to sort numeric strings with trailing zeroes in Python?
我想对数字字符串列表(带尾随零)进行排序,就像通常对数字进行排序一样。 如果该列表中提供了数字字符串,我还想返回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等。它用于我公司的产品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)
它可以返回True。
Edit1:对不起,让我不清楚。 让我解释一下我公司正在使用的编号系统:
系列A的第一个产品的ID:1.1
A系列第二个产品的ID:1.2
...
A系列第五十个产品的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”之类的版本号(例如,针对Beta版本或发行候选版本)。 根据您的需要,您可以在LooseVersion
或StrictVersion
之间进行选择(有关它们之间的区别,请参见文档字符串)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.