【问题标题】:Is there any way to genarate a string which will have index wise alternative cases?有没有办法生成一个具有索引替代情况的字符串?
【发布时间】:2019-01-12 22:03:03
【问题描述】:

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

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

【问题讨论】:

  • ''.join([''.join(t) for t in zip(s[0::2].lower(),s[1::2].upper())]) 其中s 是您的字符串。

标签: python-3.x string


【解决方案1】:

除了提供的答案之外的另一个选项:

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'

【讨论】:

    【解决方案2】:

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

    至于您的问题,一种解决方案是创建一个列表,在其中存储您希望新字符串包含的字符,然后在最后创建一个新字符串:

    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)
        )
    

    【讨论】:

      【解决方案3】:

      字符串是不可变的,不支持项目分配。尝试将 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
      

      【讨论】:

        【解决方案4】:

        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
        

        【讨论】:

          猜你喜欢
          • 2015-09-25
          • 1970-01-01
          • 2021-03-26
          • 1970-01-01
          • 2019-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多