파이썬 리스트 내포

파이썬 리스트 내포

QA

파이썬 리스트 내포

답변 1

본문

리스트 a에서 3의 배수를 문자열로 변환하여 [1,2,'3',4,5,'6',7,8,'9',10]을 리스트 내포를 활용해서 만들려고 합니다.

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 

1. [str(i) for i in a if i%3==0 else i]
2. [str(i) if i%3==0 else i for i in a]

 

1번 코드는 [표현식 for 항목 in 반복가능객체 if 조건문 else 조건문] 이고,

2번 코드는 [표현식 if 조건문 else 조건문 for 항목 in 반복가능객체]입니다.

 

그런데 2번 코드는 정상적으로 잘 작동하는데, 1번 코드를 실행하면 'else' 부분에서 invalid syntax error가 뜹니다. 리스트 내포에 있어서 if 조건문이 뒤에 위치해도 되는 것으로 알고있는데, else와 같이 쓸때는 순서가 바뀌어야하는 것인가요? 부탁드립니다!

이 질문에 댓글 쓰기 :

답변 1

안녕하세요?

말씀하신대로 Python의 List comprehension에서는 if 문이 앞에 올 수도 있고 뒤에 올 수도 있습니다 ^^

다만 위 문제는 삼항연산자(Ternary operators)의 문제와 연관이 되어 있습니다!

 

올려주신 1번 코드의 if는 순수한 if 문에서의 if입니다.

이를 List comprehension을 사용하지 않고 풀어쓰면 다음과 같습니다.


x = []
for i in a:
    if i % 3 == 0: x.append(str(i))
    else: x.append(i)

 

그러나 2번 코드의 if는 순수한 의미의 조건문이 아니라 삼항연산자에 해당합니다 ㅠㅠ

삼항연산자는 "참인 경우의 값 if 조건 else 거짓인 경우 값" 형식으로만 사용할 수 있을 뿐,

연산자 각 항의 사이에 for 문을 넣을 수 없습니다.

즉 2번 코드는 사실상 아래와 같이 괄호가 있는 것과 동일한 의미입니다.


x = [(str(i) if i % 3 == 0 else i) for i in a]

 

이는 일반적인 프로그래밍 언어에서 =가 한 개 있으면 '대입'을 의미하지만, 

두 개 또는 세 개를 사용하여 ==가 되면 대입과는 무관하게 '등호'를 의미하는 것과도 유사하다고 볼 수 있습니다.

 

참고로 작성하신 코드는 다음과 같이 더욱 파이써닉하게 작성할 수도 있습니다 ^^


x = [[i, str(i)][i % 3 == 0] for i in a]

 

보다 상세한 설명은 Stackoverflow를 참고하시면 되겠습니다.

https://stackoverflow.com/questions/4406389/if-else-in-a-list-comprehension

 

그럼 오늘도 좋은 오후 되세요~! ^-^

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 209
© SIRSOFT
현재 페이지 제일 처음으로