如何过滤所有非数字字符,以及从字符串到数字的数字

时间:2018-02-13 15:41:00

标签: python-3.x python-3.4

我想按照以下步骤激活一个功能:

1.首先过滤掉所有非数字字符。

2.计算这些数字的任何线性函数。

3.计算每个结果的产品并返回答案。

例如:

>>print(digit_com_mul("8?97D4b"))

   36

这是我试图执行的功能,但我不明白过滤器后如何将字符串转换成数字

def digit_complete_mul(data):
     return reduce(lambda x,y:x*y,map(lambda x: 10-x,int(filter(lambda x:x.isdigit(),data))))

3 个答案:

答案 0 :(得分:0)

使用字符串(s)和线性函数(f),以下工作:

def func(s, f):
    l = (f(int(c)) for c in s if c.isdigit())
    p = 1
    for i in l:
        p *= i
    return p

您还可以使用functools.reduce方法:

def func(s, f):
    l = (f(int(c)) for c in s if c.isdigit())
    return functools.reduce(lambda x,y : x*y, l)

(如果你愿意,你可以将第一行扔到第二行,但稍微不必要)

两者都给出了预期的输出:

>>> func('a1b2cd3e', lambda x: x+1)
24
>>> 2 * 3 * 4 #<-- same calc.
24

答案 1 :(得分:0)

考虑:

digits = (int(c) for c in input_string if c.isdigit())
values_of_f = map(f, digits)
product = functools.reduce(lambda acc, x: acc * x, values_of_f)

先写下来,稍后内联(如果有的话)。

答案 2 :(得分:0)

所以我找到了办法。

只需在线性函数中将字符更改为int:

from functools import reduce

def digit_complete_mul(data):
    return reduce(lambda x,y:x*y,map(lambda x: 10-int(x),filter(lambda x:x.isdigit(),data)))