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

时间:2011-05-19 18:08:33

标签: 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

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

5 个答案:

答案 0 :(得分:12)

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

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

splittedname(s1) > splittedname(s2)

更新:由于您的名字显然可以包含除数字之外的其他字符,因此您需要检查ValueError并将任何无法转换为int的值保持不变:< / p>

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']

答案 1 :(得分:1)

这不是一种内置方法,但它应该有效:

>>> def lt(num1, num2):
...     for a, b in zip(num1.split('.'), num2.split('.')):
...         if int(a) < int(b):
...             return True
...         if int(a) > int(b):
...             return False
...     return False
... 
... lt('4.2', '4.11')
0: True

可以清理,但它给你的要点。

答案 2 :(得分:1)

您正在寻找的是“自然分类”。这与“词典排序”相反。有几个配方可以做到这一点,因为你想要的确切输出是特定于实现的。一个快速谷歌搜索产生这个(注意*这不是我的代码,我也没有测试过它):

import re

def tryint(s):
    try:
        return int(s)
    except:
        return s

def alphanum_key(s):
    """ Turn a string into a list of string and number chunks.
        "z23a" -> ["z", 23, "a"]
    """
    return [ tryint(c) for c in re.split('([0-9]+)', s) ]

def sort_nicely(l):
    """ Sort the given list in the way that humans expect.
    """
    l.sort(key=alphanum_key)

http://nedbatchelder.com/blog/200712.html#e20071211T054956

答案 3 :(得分:0)

使用s1.split(".")创建小数点前后的项目列表,然后对列表列表进行排序,例如:

import random
sheets = list([str(x), str(y)] for x in xrange(1, 5) for y in xrange(0,99))
print sheets
#sheets in order
random.shuffle(sheets)
print sheets
#sheets out of order
sheets.sort()
print sheets
#sheets back in order

所以,你的实现可能是:

#assume input sheets is a list of the worksheet names
sheets = list(x.split(".") for x in input_sheets)
sheets.sort()

答案 4 :(得分:-3)

如果您知道它们是实数[*],只需:

>>> float(s1) > float(s2)
True

[*]否则,请准备好处理已提升的ValueError