파이썬 리스트 내포
본문
리스트 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
그럼 오늘도 좋은 오후 되세요~! ^-^
!-->!-->!-->