【问题标题】:Python - Parse a string with custom price unitsPython - 使用自定义价格单位解析字符串
【发布时间】:2011-03-28 12:52:17
【问题描述】:

在 Python 中将字符串解析为 int 的最快方法是什么?该字符串可能包含自定义单位,例如“k”(千)、“m”(百万)或“b”(十亿)。

例如:

100  -> 100
100k -> 100000
100m -> 100000000
100b -> 100000000000

谢谢。

【问题讨论】:

    标签: python string parsing


    【解决方案1】:
    def convert(val):
        lookup = {'k': 1000, 'm': 1000000, 'b': 1000000000}
        unit = val[-1]
        try:
            number = int(val[:-1])
        except ValueError:
            # do something
        if unit in lookup:
            return lookup[unit] * number
        return int(val)
    
    >>> print convert("100m")
    >>> 100000000
    

    创建一个查找表,然后将数字拆分为数字部分和单位。如果单位部分存在,请查看我们的表格并使用它来创建最终数字。否则,返回数字。

    【讨论】:

      【解决方案2】:
      def numerize(s):
          multipliers = {'k': 10**3, 'm': 10**6, 'b': 10**9}
      
          if s[-1] in multipliers:
              return int(s[:-1]) * multipliers[s[-1]]
          else:
              return int(s)
      

      【讨论】:

        【解决方案3】:

        编辑:更好的示例,可能的错误修复

        >>> def get_unit(ustr):
        ...     if ustr == '': return 'u'
        ...     return ustr.lower()
        ... 
        >>> import re
        >>> r=re.compile('([1-9][0-9]*)([kKmMbBgG]?)')
        
        >>> units={'k':1000,'m':1000000,'g':1000000000,'b':1000000000,'u':1}
        >>> result=r.match('120k')
        >>> int(result.group(1))*units[get_unit(result.group(2))]
        120000
        >>> result=r.match('44')
        >>> int(result.group(1))*units[get_unit(result.group(2))]
        44
        >>> result=r.match('44M')
        >>> int(result.group(1))*units[get_unit(result.group(2))]
        44000000
        >>> 
        

        【讨论】:

        • 我们可以只使用units[result.group(2)] 并以'':1 为单位。
        【解决方案4】:

        您可以定义将数字映射到自身并将单位映射到零的字典:

        units = {"0":"0", "1":"1", #etc.
                 "k":"000",
                 "m":"000000"} # etc.
        

        然后你像这样将一个字符串转换为一个 int

        int_value = int("".join(map(units.get, string_value)))
        

        【讨论】:

        • @Kimvais:你什么意思?我应该怎么str
        • 这个方案确实不太理想。虽然是个好主意,但它不适合乘数不以 X 个零结尾的情况,例如当您希望 K 为 *1024 时。
        猜你喜欢
        • 2013-04-18
        • 2013-02-16
        • 1970-01-01
        • 2022-10-16
        • 2022-12-14
        • 2014-05-28
        • 2023-04-02
        • 2011-10-25
        • 2011-07-14
        相关资源
        最近更新 更多