Python-尝试乘以列表

时间:2015-11-02 00:20:24

标签: python python-3.x python-3.4

所以基本上我在这里要做的是询问用户输入随机字符串,例如:

asdf34fh2

我想将这些数字从列表中拉出来并获得[3,4,2],但我会继续[34, 2]

import re 

def digit_product():        
    str1 = input("Enter a string with numbers: ")

    if str1.isalpha():
        print('Not a string with numbers')
        str1 = input("Enter a string with numbers: ")
    else:
        print(re.findall(r'\d+', str1))   

digit_product()      

然后我想把这些数字列表加倍,最终得到24。

5 个答案:

答案 0 :(得分:7)

你的正则表达式\d+是罪魁祸首。 +表示它匹配一个或多个连续数字(\d):

asdf34fh2
    ^-  ^
    \   \_ second match: one or more digits ("2")
     \____ first match: one or more digits ("34")

您似乎只想匹配一位数字,因此请使用\d而不是+

答案 1 :(得分:0)

如果你问我,最容易使用理解。

>>> a = "asdf34fh2"
>>> [i for i in a if i in '0123456789']
['3', '4', '2']

>>> [i for i in a if i.isdigit()]
['3', '4', '2']

答案 2 :(得分:0)

import re
import functools

def digit_product():

    str=input("Enter a string with numbers: ")
    finded = re.findall(r'\d', str)
    if not finded:
        print('Not a string with numbers')
    else:
        return functools.reduce(lambda x, y: int(x) * int(y), finded)

def digit_product2():
    input_text = input("Enter a string with numbers: ")
    return functools.reduce(lambda x, y: int(x) * int(y), filter(str.isdigit, input_text))

>>> digit_product()
Enter a string with numbers: a2s2ddd44dd
64

>>> digit_product2()
Enter a string with numbers: a2s2ddd44dd
64

答案 3 :(得分:0)

这是一个方便的单行

print(reduce(lambda x, y: x * y, [int(n) for n in text_input if n.isdigit()]))

无需导入re。如果可以使用内置函数执行此操作,则应避免导入资源。

同时避免使用str作为变量名称。它保留给字符串类型。

reduce(lambda …部分一开始很难搞定。但你可以用它来乘以列表中的所有项目。

算法说明

首先,检查输入字符串中的所有元素(字符)。如果检测到数字,它将作为整数附加到列表中。然后列表将减少到内部所有元素的因子。

你没有说过零值。照顾它,例如

print(reduce(lambda x, y: x * y, [int(n) for n in text_input if n.isdigit() and n is not '0']))

答案 4 :(得分:-1)

正则表达式很慢并且通常很难处理。为了您的目的,我建议使用内置的函数式编程和列表表达式:

In [115]: a = "asdf34fh2gh39qw3409sdgfklh"

In [116]: filter(lambda x: x.isdigit(), a)
Out[116]: '342393409'

In [117]: [char for char in filter(lambda x: x.isdigit(), a)]
Out[117]: ['3', '4', '2', '3', '9', '3', '4', '0', '9']