使用python版本比较错误

时间:2018-05-31 20:03:00

标签: python python-3.x

我有以下python代码,它比较两个版本v1和v2并输出以下内容:

0 = version's are same
1 = v1 > v2
-1 = v2 > v1

代码如下:

class Solution(object):
    def compareVersion(self, version1, version2):

        n1, n2 = len(version1), len(version2)
        i, j = 0, 0
        while i < n1 or j < n2:
            v1, v2 = 0, 0
            while i < n1 and version1[i] != '.':
                v1 = v1*10 + int(version1[i])
                i += 1
            while j < n2 and version2[j] != '.':
                v2 = v2*10 + int(version2[j])
                j += 1
            if v1 != v2:
                return 1 if v1 > v2 else -1
            i += 1
            j += 1

        return 0

if __name__ == "__main__":
    print (Solution().compareVersion("2.10", "2.06"))

以上代码输出以下内容,因为v1&gt; V2

1

但是当我输入

if __name__ == "__main__":
    print (Solution().compareVersion("2.1", "2.06"))

输出

-1`

如何解决此问题,由于缺少零,输出不正确。

3 个答案:

答案 0 :(得分:3)

将字符串拆分为点并将数字视为整数:

>>> version_string = "2.06"
>>> version_as_integers = tuple(int(segment) for segment in version_string.split('.'))
>>> version_as_integers
(2, 6)

然后,只需比较版本:

if version_1_as_integers < version_2_as_integers:
    return -1
elif version_1_as_integers == version_2_as_integers:
    return 0
else:
    return 1

完整的解决方案:

def version_to_integers(version_string):
    return tuple(int(segment) for segment in version_string.split('.'))

def compare_versions(version_string_1, version_string_2):
    v1 = version_to_integers(version_string_1)
    v2 = version_to_integers(version_string_2)
    return ((v1 > v2) - (v1 < v2))

最后一行是来自a codegolf.stackexchange.com question

的技巧

答案 1 :(得分:-1)

通过一些研究和@zvone和@DeepSpace对原帖的评论。我发现了这个:

版本不是浮点数,因此它们不属于十进制数类别,因此十进制数算术不适用于版本控制。根据语义版本2.0.0(https://semver.org/#spec-item-2),版本号不应该跟前导零。因此,2.06是一种糟糕的版本控制方式。一开始应该是2.1,2.6等。如果您遵循语义版本2.0.0,您可以避免这种困境。

答案 2 :(得分:-4)

转换为浮点而不是int

>>> i = "2.10"
>>> j = "2.06"
>>> float(i) > float(j)
True
>>> i = "2.1"
>>> float(i) > float(j)
True