在for循环中使用if ... else返回字符串

时间:2019-09-09 05:56:41

标签: python python-3.x for-loop

所以我在这里尝试将字符串' ABcsad f!,'转换为
字符串'abcsadf', 所以基本上我想将空格和非Alpha替换为'' 但是我的代码根本不起作用...

s = ' ABcsad f!,'

def norm(s):
    b=''
    i=0
    for i in range(0,len(s)+1):
        if (s[i].isalpha() is False) or (s[i].isspace() is False) :
            return b+=''
        else:
            return b+=s[i]
        i = i+1   

print(norm(s))

任何人都可以告诉我我哪里出了错?

5 个答案:

答案 0 :(得分:5)

尝试一下:

s = ' ABcsad f!,'
def norm(s):
    return ''.join(i for i in s.lower() if i.isalpha())
print(norm(s))

输出

'abcsadf'

答案 1 :(得分:4)

这是您出问题的地方

  1. 您将返回值放在for循环中。 Return退出整个norm函数,而不是让for循环结束。它需要移到外面。

  2. len(s) + 1导致超出范围的错误。应该只是len(s)

  3. 要删除空格时,应检查s[i].isspace()是否为真。

  4. 如果您希望所有内容都小写,则需要将s[i]改成s[i].lower()

  5. 您可以使用b += ...,但不能在其自己的return语句中使用它。无论如何都没有关系,因为您不应该在那儿使用return。

def norm(s):
    b=''
    for i in range(0,len(s)):
        if (s[i].isalpha() is False) or (s[i].isspace() is True):
            b += ""
        else:
            b += s[i].lower()
        i = i+1
    return b

s = ' ABcsad f!,'
print(norm(s))

答案 2 :(得分:2)

可能使用正则表达式:

import re

mystring = ' ABcsad f!,'
print (re.sub('[^A-Za-z0-9]+', '', mystring)).lower()

输出:

abcsadf

答案 3 :(得分:1)

问题在于,您的代码有错误,因为您试图在无效位置返回b

您的代码

return b+=''
python中的

在Java之类的语言中无法正常工作。您必须显式返回b

尽管这不是最好的方法,但是只是尝试使用与您编写的代码相同的代码,但是使用的是正确的方法(不是pythonian的方法;-))

s = ' ABcsad f!,'

def norm(s):
    b=''
    i=0
    for i in range(0, len(s)):
        if not s[i].isalpha() or s[i].isspace():
            b += ''
        else:
            b += s[i]
        i = i+1
    return b

print(norm(s))

还有更多类似regex的方法,使用replace操作可以在python中更有效地执行此操作。希望你能弄错。

答案 4 :(得分:0)

您在第一次迭代后返回了b。不管第一个字符是什么,您都返回了b,它没有让循环遍历您的字符串。因此,您需要使return b处于循环状态。并且也不需要return b+=s[i]。只要return b+s[i]就可以了。实际上,您不能在return语句中分配值。但是,可以像下面这样缩短代码:

s = ' ABcsad f!,'

def norm(s):
    b=''
    i=0
    for i in range(0, len(s)):
        if s[i].isalpha():
            b+=s[i]
    return b.lower()

print(norm(s))