【问题标题】:Problem with changing lowercase letters to uppercase and vice versa using str.replace使用 str.replace 将小写字母更改为大写字母的问题,反之亦然
【发布时间】:2020-07-24 21:49:13
【问题描述】:

好的,这是我的代码,我不想使用内置的 swapcase() 方法。它不适用于给定的字符串。

def myFunc(a):
    for chars in range(0,len(a)):
        if a[chars].islower():
            a = a.replace(a[chars], a[chars].upper())
        elif a[chars].isupper():
            a = a.replace(a[chars], a[chars].lower())
    return a

print(myFunc("AaAAaaaAAaAa"))

【问题讨论】:

  • 你的问题是什么?
  • 我试过了,结果是:AAAAAAAAAAAA。这是预期的输出?我用 python3 运行它
  • @PatrickArtner 大写字母应改为小写,小写字母应改为大写
  • 这能回答你的问题吗? Swapping string case in Python
  • @pcampana 不行,大写字母要改小写。

标签: python string replace uppercase lowercase


【解决方案1】:

replace 更改所有字母并将值分配回a,因此您最终得到所有大写字母。

def myFunc(a):
    # use a list to collect changed letters
    new_text = []
    for char in a:
        if char.islower():
            new_text.append(char.upper())
        else:
            new_text.append(char.lower())

    # join the letters back into a string
    return ''.join(new_text)

print(myFunc("AaAAaaaAAaAa"))  # aAaaAAAaaAaA

或更短:

def my2ndFunc(text):
    return ''.join( a.upper() if a.islower() else a.lower() for a in text)

使用列表推导和三元表达式来修改字母(参见Does Python have a ternary conditional operator?

【讨论】:

  • 是否可以直接将更改应用到“a”参数?无需创建新变量。比如 a = a.replace(a[chars], a[chars].upper())
  • @Shera 试图“操纵”python 字符串是不好的——字符串是不可变的——本质上你破坏了原始字符串并一遍又一遍地创建一个新字符串,这简直是坏事。所以不,没有办法在 python 中改变 immutable 字符串。使用列表并将其重新加入是要走的路。见 f.e. changing-one-character-in-a-string-in-pythona = a.replace(a[chars], a[chars].upper()) 对您的原始字符串没有任何作用,它将一个新字符串分配给同一个命名变量
  • 所以这就是我的理解,如果我错了,请纠正我:假设我们有这个字符串 a = "AaAaA",我们只想用 "b" 替换 a[1] 元素, 因为如果我们使用 a.replace(a[1], "b") 函数 a[1] 是一个小写的 "a",它会将整个字符串中的每个小写 "a" 替换为 "b" 而不仅仅是字符串的第二个元素,如果我们只想替换第二个元素,我们将不得不使用您提供的代码(当然还有操作 a[1] 并将其添加到一个 NEW 变量中,而其他的保持不变。)对吗?
  • 您可以使用 str.replace() 并限制替换的数量,但它只会替换第一个。 (docs.python.org/3/library/stdtypes.html#str.replace 关于如何指定计数)这对您没有帮助,因为您仍然将 AaAaAa 更改为 aaAaAa(索引 0 == a)然后更改为 AaAaAa(索引 1 = a)然后更改为 AaAaA( index 2 = A) 等,因为只更改您所在索引处字符的第一次出现。我的代码通过你的字符串,一次取一个字符并将相反的上/下放入列表中&最后返回列表的字符串
【解决方案2】:

问题是您正在替换字符串中该字符的所有出现。这里有一个可行的解决方案:

def myFunc(a):
    result = ''
    for chars in range(0,len(a)):
        print(a[chars])
        if a[chars].islower():
            result += a[chars].upper()
        elif a[chars].isupper():
            result += a[chars].lower()
    return result

print(myFunc("AaAAaaaAAaAa"))

【讨论】:

  • 因此,您创建了一个名为“result”的新变量,是的,它以这种方式工作,但是是否可以像我提供的代码中那样使用替换方法将更改应用于参数“a” ?为什么它不起作用。比如:a= a.replace(a[chars], a[chars].upper())
  • 试图“操纵”一个python字符串是不好的——字符串是不可变的——本质上你破坏了原始字符串并一遍又一遍地创建一个新字符串,这简直是坏事。如果您附加到a 它相同,您创建一个新字符串并将其分配给相同的变量。所以不,没有办法在 python 中改变 immutable 字符串。使用列表并将其重新加入是要走的路。见 f.e. changing-one-character-in-a-string-in-python
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-05
  • 2016-06-26
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2017-07-29
  • 2018-04-01
相关资源
最近更新 更多