2011-03-28 72 views
1

在Python中将字符串解析为int的最快方法是什么?该字符串可能包括自定义单位,如“k”(公斤),“m”(百万)或“b”(十亿)。Python - 用自定义价格单元解析字符串

例如:

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

感谢。

回答

6
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 

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

0

可以定义映射号码给自己和单位零的词典:

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

然后你字符串转换为int这样

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

@Kimvais:你是什么意思?我应该怎样“锻炼”? – 2011-03-28 13:04:08

+0

这个解决方案真的不理想。虽然这是一个很好的想法,但它并不适合乘数不以X数量的零结束的情况,例如,当你想K是* 1024。 – JackWilson 2011-03-28 13:05:32

+0

哦,没关系,我不识字:) – Kimvais 2011-03-28 13:07:25

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

编辑:更好的例证,可能的误差修正

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

我们可以使用'units [result.group(2)]'并且单位为''':1'。 – Cheng 2016-05-01 13:40:54