有什么办法可以使字符串具有索引明智的替代情况?

时间:2019-01-12 22:03:04

标签: python-3.x string

我正在尝试说明以下问题: “定义一个名为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'对象不支持项目分配

那么这个问题应该怎么解决?

4 个答案:

答案 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