如何使用for循环替换提供的字符串中的大小写

时间:2018-02-05 20:05:01

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

我想创建一个for循环,它将在提供的字符串中交替使用大写和小写字母(以用户输入的形式给出)。 我的一般想法是使一个for循环从0开始并以字符串的长度结束,步长为2。 这是我到目前为止(x是字符串变量)。

for a in range (0,len(x),2):
    x=x[0:a] + x[a].upper + x[a+1::]
    print("Alternate Lowercase Letters:", a)

当我使用它时,我收到一条错误消息

  

“TypeError:必须是str,而不是builtin_function_or_method”

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

如前所述,该错误的原因是您有x[a].upper而不是x[a].upper()。因此,Python认为您希望将该方法与x[0:a]x[a+1::]字符串连接起来,这是没有意义的。

但是,有更好的方法来完成这项任务。您可以使用列表推导来执行大小写更改,然后使用.join方法将列表内容转换为字符串。以下是两种变体。

我们可以使用enumerate来获取字符索引,同时迭代输入字符串中的字符。如果索引是奇数,我们将char设置为小写,否则我们将其设为大写。

def alt_case(s):
    return ''.join([u.lower() if i % 2 else u.upper() for i, u in enumerate(s)])

或者,我们可以使用切片来分离奇数和&甚至是字符,然后在执行大小写转换后使用zip将它们重新组合在一起。

def alt_case(s):
    hi = s[::2].upper()
    lo = s[1::2].lower()
    return ''.join([u+v for u, v in zip(hi, lo)])

这是测试这些功能的代码。

s = 'This is a test'
print(alt_case(s))

<强>输出

ThIs iS A TeSt

FWIW,这是第一个版本的神秘变体:

def alt_case(s):
    return ''.join([(str.upper, str.lower)[i%2](u) for i, u in enumerate(s)])

答案 1 :(得分:2)

您提出的问题是,您使用.upper而不是.upper()。前者为您提供函数引用,后者为您提供函数的返回值。

另一件需要考虑的事情是,如果字符串x很长,则将其转换为列表并重新分配值,而不是每次迭代重建整个字符串。如果x是一个短字符串,它并不重要,因为没有可察觉的运行时差异,但如果它相当长,那么运行时肯定会有很大差异,因为这个方法是O( x)当前方法是O(x 2 )。

答案 2 :(得分:2)

您可以将generater-comprehensionstr.join一起使用。我相信这是最有效的解决方案:

def alternate(s):
    return ''.join(c.upper() if i & 1 else c.lower() for i, c in enumerate(s))

并且测试表明它有效:

>>> alternate('testing')
'tEsTiNg'