我正在尝试说明以下问题: “定义一个名为myfunc的函数,该函数接受一个字符串,并返回一个匹配的字符串,其中每个偶数字母均大写,每个奇数字母均小写。假设传入的字符串仅包含字母,而不必担心数字,空格,输出字符串可以以大写或小写字母开头,只要字母在整个字符串中交替出现即可。” 因此,我尝试了以下代码块:
def myfunc(word):
i = 0
while i!=len(word):
if (i+1)%2 == 0:
word[i] = word[i].upper()
i+=1
return word
但是python解释器抛出了一个错误,指出:
TypeError:'str'对象不支持项目分配
那么这个问题应该怎么解决?
答案 0 :(得分:2)
除了提供的答案之外,还有另一个选择:
from itertools import cycle
def myfunc(word):
funcs = cycle((str.lower, str.upper))
return ''.join(next(funcs)(char) for char in word)
示例:
import string
print(myfunc(string.ascii_lowercase))
输出:
'aBcDeFgHiJkLmNoPqRsTuVwXyZ'
答案 1 :(得分:1)
字符串不是列表,您不能将字符分配给索引。这是因为字符串是不可变的,一旦创建,就永远无法更改它们。您可能会认为可以,但是无论何时,您都在创建一个新字符串并将其分配给相同的名称。
对于您的问题,一种解决方案是创建一个列表,在其中存储要包含新字符串的字符,然后从末尾创建一个新字符串:
#include <stdio.h>
static int c = 20; // Static vairble
int main(){
int *ptr = &c;
return 0;
}
请注意,我同时更改了两种情况,因为根据问题陈述,传入的字符串可能已经全部大写了。
您也可以创建新的字符串而不是使用列表(例如,将ptr
定义为空字符串并执行main
),但是这将创建许多不同大小的字符串,最后返回完整的字符串字符串-可以,但是效率不高。如果您要追求效率,请尝试以下版本:
def myfunc(word):
chars = [] # an empty list
for index, char in enumerate(word): # this makes the whole indexing thing easier
if index % 2 == 0:
chars.append(char.lower())
else:
chars.append(char.upper())
return "".join(chars)
答案 2 :(得分:0)
字符串是不可变的,不支持项目分配。尝试将str转换为list或bytearray或其他可变的变量,应用操作并将其转换回str。
def myfunc(word):
array = [c for c in word] # inefficient, but wotks
while i!=len(word):
if (i+1)%2 == 0:
array[i] = array[i].upper()
i+=1
return "".join(array) # convert list into string
答案 3 :(得分:0)
str
是不可变的类型,您无法查看其索引。您可以重复使用大部分工作,但是可以将字符串转换为列表,然后再加入其中:
def myfunc(word):
templist = list(word)
i = 0
while i!=len(templist):
if (i+1)%2 == 0:
templist[i] = templist[i].upper()
i+=1
return ''.join(templist)
或者您可以继续构造新的字符串:
def myfunc(word):
i = 0
ret_str = ''
while i!=len(word):
if (i+1)%2 == 0:
ret_str += word[i].upper()
else:
ret_str += word[i]
i+=1
return ret_str