一尘不染

比较两个包含数字的python字符串

python

更新:我应该早点指定它,但是并非所有名称都只是浮点数。例如,其中一些以“ YT”为前缀。因此,例如“ YT1.1。所以,您遇到相同的问题,YT1.9
<YT1.11应该为真。我真的很惊讶字符串比较失败…。

您好,这应该是一个非常简单的问题,但我似乎找不到答案。我想按名称对一堆XL工作表进行排序。每个名称都是数字,但与教科书“节”的编号方式相同,这意味着第4.11节在4.10之后,在4.9和4.1之后。我以为只是将这些数字作为字符串进行比较就可以了,但是我得到了以下信息:

>>> s1 = '4.11'
>>> s2 = '4.2'
>>> s1> s2
False
>>> n1 = 4.11
>>> n2 = 4.2
>>> n1 > n2
False

如何比较这两个值,使4.11大于4.2?


阅读 287

收藏
2021-01-20

共1个答案

一尘不染

将名称转换为整数元组并比较元组:

def splittedname(s):
    return tuple(int(x) for x in s.split('.'))

splittedname(s1) > splittedname(s2)

更新 :由于您的姓名显然可以包含数字以外的其他字符,因此您需要检查ValueError并保留所有无法转换为整数的值:

import re

def tryint(x):
    try:
        return int(x)
    except ValueError:
        return x

def splittedname(s):
    return tuple(tryint(x) for x in re.split('([0-9]+)', s))

要对名称列表进行排序,请使用以下命令splittedname作为键功能sorted

>>> names = ['YT4.11', '4.3', 'YT4.2', '4.10', 'PT2.19', 'PT2.9']
>>> sorted(names, key=splittedname)
['4.3', '4.10', 'PT2.9', 'PT2.19', 'YT4.2', 'YT4.11']
2021-01-20