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

Ram*_*amy 5 python string numbers

更新:我应该尽早指定,但不是所有的名称都只是浮点数.例如,其中一些"前缀"为"YT".所以例如"YT1.1.所以,你有同样的问题YT1.9 <YT1.11应该是真的.我真的很惊讶字符串比较失败了....

你好,这应该是一个非常简单的问题,但我似乎无法找到答案.我想按名称排序一堆XL工作表.每个名称都是数字,但是教科书"部分"的编号方式相同,这意味着4.11之后的部分4.11出现在4.9和4.1之后.我想只是将这些数字作为字符串进行比较,但我得到以下内容:

>>> s1 = '4.11'
>>> s2 = '4.2'
>>> s1> s2
False
>>> n1 = 4.11
>>> n2 = 4.2
>>> n1 > n2
False
Run Code Online (Sandbox Code Playgroud)

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

Pär*_*der 12

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

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

splittedname(s1) > splittedname(s2)
Run Code Online (Sandbox Code Playgroud)

更新:由于您的名称显然可以包含除数字之外的其他字符,因此您需要检查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))
Run Code Online (Sandbox Code Playgroud)

要对名称列表进行排序,请将其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']
Run Code Online (Sandbox Code Playgroud)