Version number comparison in Python

后端 未结 17 2111
小蘑菇
小蘑菇 2020-11-27 10:32

I want to write a cmp-like function which compares two version numbers and returns -1, 0, or 1 based on their compared va

17条回答
  •  广开言路
    2020-11-27 11:27

    Remove the uninteresting part of the string (trailing zeroes and dots), and then compare the lists of numbers.

    import re
    
    def mycmp(version1, version2):
        def normalize(v):
            return [int(x) for x in re.sub(r'(\.0+)*$','', v).split(".")]
        return cmp(normalize(version1), normalize(version2))
    

    This is the same approach as Pär Wieslander, but a bit more compact:

    Here are some tests, thanks to "How to compare two strings in dot separated version format in Bash?":

    assert mycmp("1", "1") == 0
    assert mycmp("2.1", "2.2") < 0
    assert mycmp("3.0.4.10", "3.0.4.2") > 0
    assert mycmp("4.08", "4.08.01") < 0
    assert mycmp("3.2.1.9.8144", "3.2") > 0
    assert mycmp("3.2", "3.2.1.9.8144") < 0
    assert mycmp("1.2", "2.1") < 0
    assert mycmp("2.1", "1.2") > 0
    assert mycmp("5.6.7", "5.6.7") == 0
    assert mycmp("1.01.1", "1.1.1") == 0
    assert mycmp("1.1.1", "1.01.1") == 0
    assert mycmp("1", "1.0") == 0
    assert mycmp("1.0", "1") == 0
    assert mycmp("1.0", "1.0.1") < 0
    assert mycmp("1.0.1", "1.0") > 0
    assert mycmp("1.0.2.0", "1.0.2") == 0
    

提交回复
热议问题