更新:我应该早点指定它,但是并非所有名称都只是浮点数。例如,其中一些以“ 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?
将名称转换为整数元组并比较元组:
def splittedname(s): return tuple(int(x) for x in s.split('.')) splittedname(s1) > splittedname(s2)
更新 :由于您的姓名显然可以包含数字以外的其他字符,因此您需要检查ValueError并保留所有无法转换为整数的值:
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:
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']