【问题标题】:python vowels to lowercase and consonants to uppercasepython元音小写和辅音大写
【发布时间】:2020-10-30 15:45:03
【问题描述】:

我是 python 新手,我一直坚持这个特殊的练习。 我正在尝试编写一个程序来获取用户的输入(字符串)并将所有元音切换为小写,将辅音切换为大写。

示例输入:"Learning python is fun."
预期输出:"LeaRNiNG PYTHoN iS FuN."

这是我尝试过的:

def toggle(phrase):
    for letter in phrase:
        if letter not in "aeiou":
            letter = letter.upper()
        elif letter in "AEIOU":
            letter = letter.lower()
        else:
            letter = letter.upper()
    return phrase


print(toggle(input("Enter a phrase: ")))

但是,输出没有切换任何东西。我错过了什么?

【问题讨论】:

  • 我没看到你在哪里改变了短语本身

标签: python python-3.x uppercase lowercase


【解决方案1】:

我假设您的意思是“所有元音都是小写,所有辅音都是大写”

def toggle(phrase):
    new_phrase = ""
    for letter in phrase:
        if letter in ['a', 'e', 'i', 'o', 'u'] or letter in ['A', 'E', 'I', 'O', 'U']:
            new_phrase += letter.lower()
        else:
            new_phrase += letter.upper()
    return new_phrase


print(toggle(input("Enter a phrase: ")))

【讨论】:

  • 您可以很容易地保留 OP 测试的形式(这在扫描字符串时比 list 的字符串更有效)。如果您想让它更简单,只需执行if letter in 'aeiouAEIOU':if letter.lower() in 'aeiou': 会更短且启动速度更快。
  • 您实际上不能只扫描“aeiou”,因为这样代码会转到 else 行,然后字母就会变成大写。
  • 重读我输入的内容;第二个版本调用.lower(),所以它只需要检查'aeiou'
【解决方案2】:

问题是您正在循环遍历短语的可迭代对象,并且通过分配字母实际上并没有更改短语中的字母。

您可以将整个字符串转为大写然后使用str.translate

vowel_trans = str.maketrans('AEIOU', 'aeiou')
def toggle(phrase):
    return phrase.upper().translate(vowel_trans)

如果这还不够,您可以使用相同的逻辑在循环时生成一个字符串并返回该字符串。

def toggle(phrase):
    new_phrase = ''
    for letter in phrase.upper():
        if letter in 'AEIOU':
            new_phrase += letter.lower()
        else:
            new_phrase += letter

编辑

这也可以简化为理解:

def toggle(phrase):
    return ''.join(l.lower() if l in 'AEIOU' else l for letter in phrase)

甚至可以使用re:

import re

def toggle(phrase):
    return re.sub('AEIOU', 'aeiou', phrase.upper())

【讨论】:

  • 注意:如果您希望经常这样做,最好在函数外部全局调用并存储一次 maketrans 的结果,以避免重新创建每次通话的翻译词典(不变)。
  • 当然,我什至没有想到好的观察。
【解决方案3】:

当您说letter = letter.upper 时,您实际上并没有更改字符串phrase 的内容,您只是更改了变量letter 指向的字符串。

事实上,你不能在 python 中改变字符串。尝试运行"hello"[0] = "g" 会报错。

一种解决方案不是尝试修改字符串phrase,而是构建一个新字符串并将正确的字母放入其中。这就是我的意思:

def toggle(phrase):
    answer = ""
    for letter in phrase:
        if letter not in "aeiouAEIOU":
            answer = answer + letter.upper()
        else:
            answer = answer + letter.lower()
    return answer


print(toggle(input("Enter a phrase: ")))

当你运行它时,你会得到

Enter a phrase: Learning python is fun.
LeaRNiNG PYTHoN iS FuN.

当我说answer = answer + letter.upper() 时,看起来我正在改变字符串,但实际发生的是,类似于你对字母所做的,我实际上并没有改变字符串本身,我只是在制作一个新字符串 (answer + letter.upper()) 并将该字符串的值分配给变量 answer。这是一个微妙但重要的区别。

我还更改了您决定是使用大写还是小写的方式,以使其适用于小写元音。按照你最初的方式,如果当前字母是"a",else 分支会运行,并且在不应该的时候会变为大写。这是因为"a""aeiou" 中,而不在"AEIOU" 中,所以else 分支运行并且变为大写。

【讨论】:

    猜你喜欢
    • 2018-08-20
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多