2016-10-31 4 views
4

대소 문자가 혼합 된 문자열이 있습니다. "aBcDeF". 소문자를 모두 대문자로, 대문자를 'B'로하면 소문자 만 사용하고 싶습니다. 의미, 나는 결과 "AbCDEF"를 원한다. 나는 지능형리스트에이 일을 시도했습니다파이썬 3의 목록 이해력이있는 경우 else

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.islower() 밖의 str.lower (숯) 숯불 == "ABCDEF"의 문자는 "B"문자 다른 경우]' – ewcz

+0

이없는 목록 내포물과 관련이있는 것. 그것은 단지 조건부 표현식의 올바른 사용에 관한 것입니다. – chepner

답변

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'] 
3
[char.upper() if char != 'B' else char.lower() for char in "aBcDeF"] 
0

@MooingRawr뿐만 아니라, 당신이 당신이 다른 값없이 조건식을 사용할 수 없기 때문에 구문 오류가 발생 할 것을 추가 할 것입니다.

예를 들어 a = 3 if blah은 SyntaxError를 발생 시키지만 a = 3 if blah else 4은 발생시키지 않습니다.

3

@MooingRawr은 특정 사건에 대한 최선의 답을 가지고 있지만 당신이 진정으로 당신의 지능형리스트에서 여러 if 문이 원한다면 당신은 같은 것을하고 싶은 것 :에 조금 더 쉬울 수 있습니다

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

을 두 번째의 주위에 괄호로 이해 if (임베디드) 문 : 당신이 x.upper() 두 번 기록이 있기 때문에 비록

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

이 귀하의 경우에는 적합하지 않습니다.

이것은 본질적으로 동일하다 : 예를 들어 Mooingrawr의 대답 @ 촬영

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

, 사람들은 그것의 건축하고 목록의 이해를 쌓아 경우 좀 더 쉽게 이해를 찾을 수 있습니다. 쌓인 경우 라인 내에서 주석을 달 수 있습니다. 한 줄을 되돌리려면 주석을 제거하고 모두가 좋아하는 한 줄짜리를 만들 수 있습니다.

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)