有没有办法生成一个具有索引明智的替代案例的字符串?

问题描述 投票:0回答:4

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

那么这个问题的解决方案应该是什么呢?

python-3.x string
4个回答
1
投票

字符串不是列表,您不能将字符分配给索引。那是因为字符串是不可变的 - 一旦创建,你永远不能改变它们。您可能认为可以,但无论何时,您都可以创建一个新字符串并将其指定为相同的名称。

至于你的问题,一个解决方案是创建一个列表,在其中存储你想要新字符串组成的字符,然后在最后创建一个新的字符串:

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)

请注意,我在两种情况下都更改了大小写,因为根据问题语句,传入的字符串可能已经是全部大写。

您也可以创建新的字符串而不是使用列表(即将chars定义为空字符串并执行例如chars += char.lower()),但是在最终返回完整字符串之前,这将创建许多不同大小的字符串 - 但它可以工作,但不是效率很高。如果效率是您所追求的,请尝试以下版本:

def myfunc(word):
    return "".join(
        char.upper() if index % 2 else char.lower()
        for index, char in enumerate(word)
    )

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'

0
投票

字符串是不可变的,不支持项目分配。尝试将str转换为list或bytearray或smth else mutable,应用操作并将其转换回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

0
投票

qazxsw poi是一个不可变类型,你不能指定它的索引。您可以重用已完成的大部分工作,但是将以下字符串转换为列表然后再加入:

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)
© www.soinside.com 2019 - 2024. All rights reserved.