Python3 中列表推导式中的 else if

5

我有一个混合大小写的字符串,例如 "aBcDeF"。我想将所有小写字母转换为大写字母,并且对于大写字母,只有在它们是字母'B'时才将其转换为小写字母。也就是说,我想得到结果 "AbCDEF"。我尝试使用列表推导式来实现:

x = [str.upper(char) if char.islower() 
else str.lower(char) if char == "B" for char in "aBcDeF"]
  • 这些换行只是为了方便阅读,在我的代码中它们是连在一起的

然而,我遇到了以下语法错误:

Traceback (most recent call last):
  File "python", line 11
    else str.lower(char) if char == "B" for char in "aBcDeF"]
                                          ^
SyntaxError: invalid syntax

我已经查看了类似的问题,但没有一个能够提供我答案。


3
[str.upper(char) if char.islower() else str.lower(char) if char == "B" else char for char in "aBcDeF"] - ewcz
这与列表推导无关,只是关于正确使用条件表达式的问题。 - chepner
6个回答

7
坚持你的 if-else 列表推导精神。
print([str.lower(char) if char.isupper() and char =='B' else str.upper(char) for char in "aBcDeF"])

打印:

['A', 'b', 'C', 'D', 'E', 'F']

5
[char.upper() if char != 'B' else char.lower() for char in "aBcDeF"]

4

@MooingRawr已经给出了与您的特定情况最相关的答案,但如果您真的想在列表推导式中使用多个if语句,则需要做如下操作:

[x.upper() if x.islower() else x.lower() if x=='B' else x.upper() for x in "aBcDeF"]

第二个(嵌套)if语句加上括号可能会更容易理解:

[x.upper() if x.islower() else (x.lower() if x=='B' else x.upper()) for x in "aBcDeF"]

尽管你在两个地方都写了x.upper(),但这并不是最理想的。

实际上,这等价于:

new_str = ''

for x in "aBcDeF":
    if x.islower():
        new_str += x.upper()
    elif x == 'B';
        new_str += x.lower()
    else:
        new_str += x.upper()

1
以@Mooingrawr的答案为例,如果你将列表推导式堆叠起来,人们可能会发现它的结构和理解更容易。如果堆叠后需要注释,可以在行内注释。如果你想要将其还原为单行,则可以删除注释,使其成为每个人都喜欢的单行代码。
r = [str.lower(char)                  # Do this
     if char.isupper() and char =='B' # if this
     else str.upper(char)             # else this
     for char in "aBcDeF"]            # using these
print(r)

1
简单的解决方案,
char = "aBcDeF" 

print(char.upper().replace("B", "b"))

AbCDEF

[Program finished] 

0
除了@MooingRawr之外,我想补充一点,你会得到一个语法错误,因为你不能在没有else值的情况下使用条件表达式。
例如,a = 3 if blah会引发SyntaxError,但a = 3 if blah else 4则不会。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接