compare two python strings that contain numbers

前端 未结 5 1486
礼貌的吻别
礼貌的吻别 2020-12-19 11:29

UPDATE: I should have specified this sooner, but not all of the names are simply floats. For example, some of them are \"prefixed\" with \"YT\". So for example\" YT1.1. so,

相关标签:
5条回答
  • 2020-12-19 12:14

    If you know they are real numbers [*] , simply:

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

    [*] Otherwise, be ready to handle a raised ValueError.

    0 讨论(0)
  • 2020-12-19 12:15

    What you're looking for is called "natural sorting". That is opposed to "lexicographical sorting". There are several recipes out there that do this, since the exact output of what you want is implementation specific. A quick google search yields this (note* this is not my code, nor have I tested it):

    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

    0 讨论(0)
  • 2020-12-19 12:24

    use s1.split(".") to create a list of the items before and after the decimal then sort the list of lists, example:

    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
    

    So, you implementation might be:

    #assume input sheets is a list of the worksheet names
    sheets = list(x.split(".") for x in input_sheets)
    sheets.sort()
    
    0 讨论(0)
  • 2020-12-19 12:27

    Convert the names to tuples of integers and compare the tuples:

    def splittedname(s):
        return tuple(int(x) for x in s.split('.'))
    
    splittedname(s1) > splittedname(s2)
    

    Update: Since your names apparently can contain other characters than digits, you'll need to check for ValueError and leave any values that can't be converted to ints unchanged:

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

    To sort a list of names, use splittedname as a key function to 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 讨论(0)
  • 2020-12-19 12:27

    This is not a built-in method, but it ought to work:

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

    That can be cleaned up, but it gives you the gist.

    0 讨论(0)
提交回复
热议问题