【问题标题】:I am getting the output for the program but not in the required way?我正在获取程序的输出,但不是以所需的方式?
【发布时间】:2016-09-09 20:22:43
【问题描述】:

编写一个接受字符串作为输入的 Python 函数。 该函数必须返回字符串中出现的数字 0-9 的总和,忽略所有其他字符。如果字符串中没有数字,则返回 0。

我的代码:

user_string = raw_input("enter the string: ")
new_user_string = list(user_string)
addition_list = []
for s in new_user_string:
    if ( not s.isdigit()):
        combine_string = "".join(new_user_string)
        print ( combine_string)
    else:
        if ( s.isdigit()):
            addition_list.append(s)
            test = "".join(addition_list)
            output = sum(map(int,test))
            print ( output )

输出应该是:

Enter a string: aa11b33
8

我的输出:

enter the string: aa11b33
aa11b33
aa11b33
1
2
aa11b33
5
8

【问题讨论】:

    标签: python python-2.7 python-3.x ipython


    【解决方案1】:

    这看起来有点像家庭作业......

    getsum = lambda word: sum(int(n) for n in word if n.isdigit())
    
    getsum('aa11b33')
    Out[3]: 8
    
    getsum('aa')
    Out[4]: 0
    

    逐个解释这是如何工作的:

    1. 如果n 仅由一位或多位数字组成,则函数n.isdigit() 返回True,否则返回false。 (Documentation)
    2. 语法for n in word 将遍历可迭代word 中的每个项目。由于word 是一个字符串,python 将每个字符视为一个单独的项目。
    3. sum(int(n) for n in word...) 操作将每个字符转换为int 并取所有字符的总和,而后缀if n.isdigit() 过滤掉所有非数字字符。因此,最终结果将只取字符串 word 中所有单个数字字符的总和。
    4. lambda x: some expression using x 语法构造了一个匿名函数,它接受某个值x 作为其参数,并返回冒号后面的表达式的值。为了给这个函数起一个名字,我们可以把它放在赋值语句的右边。然后我们可以像普通函数一样调用它。通常最好使用普通的def getsum(x) 类型的函数定义,但是lambda 表达式有时对于如果你有一种一次性的函数,你只需要用作函数的参数就很有用。一般来说,在 python 中,如果你能找到一种避免它们的方法会更好,因为它们不被认为是非常可读的。

    这是一个完整的例子:

    def sumword(word):
        return sum( int(n) for n in word if n.isdigit() )
    
    word = raw_input("word please: ")
    print(sumword(word))
    

    【讨论】:

    • 它来自我正在尝试的 python 编码挑战。
    • 既然这显然是家庭作业/编码挑战材料,那么发布他做错了什么的详细解释,而不是仅仅粘贴正确答案而不解释是否有意义?
    • @machineyearning 是的。不过,其他答案现在已经有了,所以我将把我的作为解决问题的替代方法。
    • @Ben,但是,我很好奇为什么你的工作,我不完全理解你函数中的代码行;你的比我的效率高得多,这就是我问的原因。
    • @Ben 哎呀,我刚刚编辑了帖子并附上了解释,因为我以为你已经完成了。如果您认为自己的更好,请随时删除我的。
    【解决方案2】:

    应该是

    user_string = raw_input("enter the string: ")
    new_user_string = list(user_string)
    addition_list = []
    for s in new_user_string:
        if ( not s.isdigit()):
            combine_string = "".join(new_user_string)
        else:
            if ( s.isdigit()):
                addition_list.append(s)
                test = "".join(addition_list)
    
    output = sum(map(int,addition_list))
    print output
    

    你得到你的输出有两个原因。

    1. 在 if 语句中,您告诉它在遇到非数字时打印最初输入的字符串。当您查看输出时,这非常有意义 - 字符串在看到 a 时打印,字符串在看到第二个 a 时打印,字符串不打印,不打印(对于那些),然后字符串是最后一次用 b 打印。
    2. 您正在打印输出,因为 for 循环在列表中递增,这意味着它每次都打印总数。将输出变量和 print 语句移到 for 循环之外解决了这个问题。

    【讨论】:

    • 很好的解释。
    【解决方案3】:

    Python 关心缩进:

    user_string = raw_input("enter the string: ")
    new_user_string = list(user_string)
    addition_list = []
    for s in new_user_string:
        if ( not s.isdigit()):
            combine_string = "".join(new_user_string)
            #print ( combine_string)
        else:
            if ( s.isdigit()):
                addition_list.append(s)
                test = "".join(addition_list)
                output = sum(map(int,test))
    print ( output )   #<------ change here 
    

    还去掉了你的内部打印语句,因为它不是你的输出。

    【讨论】:

      猜你喜欢
      • 2021-05-07
      • 2021-02-13
      • 1970-01-01
      • 2017-04-14
      • 2013-03-15
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多