【问题标题】:How to sort numeric strings with trailing zeroes in Python?如何在Python中对带有尾随零的数字字符串进行排序?
【发布时间】:2019-08-09 15:49:58
【问题描述】:

我想对数字字符串列表(带尾随零)进行排序,就像您通常对数字进行排序一样。如果提供的数字字符串在该列表中,我还想返回 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。

编辑1: 很抱歉没有让自己清楚。让我解释一下我公司使用的编号系统:

A 系列第一个产品的 ID:1.1

A 系列第二个产品的 ID:1.2

...

A 系列第 50 款产品的 ID:1.50

B 系列第一个产品的 ID:2.1

我只想先从 A 系列中排序产品,然后是 B 系列

因此,就我而言,1.5 确实与 1.50 不同

【问题讨论】:

  • 为什么1.50 会大于1.9?看来您确实希望将它们视为小数,而是将它们视为元组 - 1, 501, 9
  • 如果产品很多,可能会有set的用途。它的存在性检查速度要快得多,但它在排序方面表现不佳。
  • 哦,1.50 是(一,五十)抱歉完全误解了。
  • 我也想知道是谁发明了这个编号系统
  • “就像你通常如何对数字进行排序”并不是对你在这里想要实现的目标的非常清晰的描述。通常,我认为 5 小于 50(而 1.5 与 1.50 相同)。您的意思是“您通常如何对 版本号 进行排序”?

标签: python sorting decimal zero trailing


【解决方案1】:

使用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)

【讨论】:

  • 这看起来是 OP 想要的答案,我打算建议不要 re 解决方案。
  • 有效!非常感谢......经过一段时间的谷歌搜索后,我找到了一个替代方案,使用 natsort 模块:print(natsort.natsorted(object_num)) 这达到了相同的结果。事实证明,我一直在寻找自然排序!
  • 非常感谢@andrej-kesely!你救了我的一天!我花了几个小时做这个
【解决方案2】:

对于版本号,您可以使用(遗憾的是没有很好的文档)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 之间进行选择(请参阅文档字符串了解它们之间的区别)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-23
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2020-05-25
    • 1970-01-01
    相关资源
    最近更新 更多