比较两个包含数字的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']
答
这不是一个内置的方法,但它应该工作:
>>> 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)
答
使用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()
很好的回答。简单而有效。 – dkamins 2011-05-19 18:16:12
不必转换为int甚至。 – marr75 2011-05-19 18:31:31