我想创建一个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”
有什么建议吗?
答案 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-comprehension
与str.join
一起使用。我相信这是最有效的解决方案:
def alternate(s):
return ''.join(c.upper() if i & 1 else c.lower() for i, c in enumerate(s))
并且测试表明它有效:
>>> alternate('testing')
'tEsTiNg'