【问题标题】:compare two python strings that contain numbers比较两个包含数字的python字符串
【发布时间】:2011-05-20 02:39:45
【问题描述】:

更新:我应该早点指定这个,但并不是所有的名字都是简单的浮点数。例如,其中一些以“YT”为“前缀”。所以例如“YT1.1。所以,你有同样的问题 YT1.9

你好, 这应该是一个非常简单的问题,但我似乎找不到答案。我想按名称对一堆 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?

【问题讨论】:

    标签: python string numbers


    【解决方案1】:

    将名称转换为整数元组并比较元组:

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

    【讨论】:

    • 很好的答案。简单有效。
    • 甚至不必转换为int。
    【解决方案2】:

    这不是内置方法,但它应该可以工作:

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

    这可以清理,但它给了你要点。

    【讨论】:

      【解决方案3】:

      您正在寻找的内容称为“自然排序”。这与“字典排序”相反。有几个食谱可以做到这一点,因为您想要的确切输出是特定于实现的。一个快速的谷歌搜索产生了这个(注意*这不是我的代码,我也没有测试过):

      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

      【讨论】:

        【解决方案4】:

        使用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()
        

        【讨论】:

          【解决方案5】:

          如果您知道它们是实数 [*] ,只需:

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

          [*] 否则,准备好处理提出的ValueError

          【讨论】:

          • 不正确。 4.11 float 2) 之后。
          • 这假定数字是有效的浮点数。
          • 不,这是假设 OP 提出了不同的问题。有效的浮点数是一个好的假设。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-28
          • 1970-01-01
          相关资源
          最近更新 更多