我正在尝试在大写和小写字母之间交替使用字符串。我目前的代码是:
def skyline (str1):
result = ''
index = 0
for i in str1:
result += str1[index].upper() + str1[index + 1].lower()
index += 2
return result
当我运行上面的代码时,我收到一条错误String index out of range
。我该如何解决这个问题?
答案 0 :(得分:2)
使用join
+ enumerate
下面的一种方法:
s = 'asdfghjkl'
''.join(v.upper() if i%2==0 else v.lower() for i, v in enumerate(s))
#'AsDfGhJkL'
答案 1 :(得分:0)
这是我重写逻辑的方式:
from itertools import islice, zip_longest
def skyline(str1):
result = ''
index = 0
for i, j in zip_longest(str1[::2], islice(str1, 1, None, 2), fillvalue=''):
result += i.upper() + j.lower()
return result
res = skyline('hello')
'HeLlO'
<强>解释强>
itertools.zip_longest
来迭代字符串的块。itertools.islice
提取每个第二个字符,而不构建单独的字符串。答案 2 :(得分:0)
尝试for i in range(len(str1)):
并在代码中将index
替换为i
。之后,你可以做到
if i % 2 == 0: result += str1[i].upper()
else: result += str1[i].lower()
答案 3 :(得分:0)
对于输入字符串中的每个字符,您将索引递增2.这就是您越界的原因。
为此目的尝试使用字符串长度。
答案 4 :(得分:0)
您不会检查您的索引是否仍然是字符串的大小。
有必要添加一个条件来验证i的值是否总是小于字符串并且i%2 == 0并且i == 0以将第1个字符放在Upper
i%2 == 0我们将在两个
上应用上面的一个字母for i, __ in enumerate(str1):
if i+1 < len(str1) and i % 2 == 0 or i == 0:
result += str1[i].upper() + str1[i + 1].lower()
答案 5 :(得分:0)
我尝试在代码中尽可能地修改,以便您可以正确理解。我刚刚在步骤2中添加了一个for循环,这样你就不会有索引超出范围。对于奇数长度字符串的最终字符,我单独处理。
def skyline (str1):
result = ''
length = len(str1)
for index in range(0, length - 1, 2):
result += str1[index].upper() + str1[index + 1].lower()
if length % 2 == 1:
result += str1[length - 1].upper()
return result
答案 6 :(得分:0)
您可以使用以下代码:
def myfunc(str1):
result=''
for i in range(0,len(str1)):
if i % 2 == 0:
result += str1[i].upper()
else:
result += str1[i].lower()
return result
答案 7 :(得分:0)
在您的代码中,您一次得到2个单词,因此您应该将循环除以2,因为循环取决于您的输入字符串,因此可以使诸如peak之类的变量等于len(您的输入输入),然后peak = int(peak / 2)会解决您的问题
def func(name):
counter1 = 0
counter2 = 1
string = ''
peak = len(name)
peak = int(peak/2)
for letter in range(1,peak+1):
string += name[counter1].lower() + name[counter2].upper()
counter1 +=2
counter2 +=2
return string