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

问题描述:

UPDATE:我应该早点指定它,但不是所有的名字都只是浮动的。例如,其中一些“前缀”与“YT”。因此,例如“YT1.1。所以,你有同样的问题YT1.9 < YT1.11应该是真的。我真的很惊讶,字符串比较失败....比较两个包含数字的python字符串

你好, 这应该是一个非常简单的问题,但我似乎无法找到答案,我想按名称对一堆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?

转换的名称为整数的元组和比较的元组:

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

很好的回答。简单而有效。 – dkamins 2011-05-19 18:16:12

+0

不必转换为int甚至。 – marr75 2011-05-19 18:31:31

如果你知道他们是实数[*],简单地说:

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

[*]否则,随时准备处理提出ValueError

+4

不正确。 4.11浮点数 2)。 – dkamins 2011-05-19 18:12:28

+0

这假设这些数字是有效的浮点数。 – Falmarri 2011-05-19 18:12:43

+1

不,这里假设OP已经提出了一个不同的问题。有效的花车是一个好的假设。 – marr75 2011-05-19 18:34:34

这不是一个内置的方法,但它应该工作:

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

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

你在找什么叫做“自然排序”。这与“词典排序”相反。有几个配方可以做到这一点,因为你想要的具体输出是实现特定的。快速谷歌搜索得到这个(注*这不是我的代码,我也没有测试过它):

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

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