테스트 사이트 - 개발 중인 베타 버전입니다

파이썬 리스트 내포

써근토마토 3년 전 조회 1,457

리스트 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개

I
3년 전

안녕하세요?

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

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

 

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

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

</p>

<p>x = []

for i in a:

    if i % 3 == 0: x.append(str(i))

    else: x.append(i)</p>

<p>

 

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

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

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

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

</p>

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

<p>

 

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

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

 

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

</p>

<p>x = [[i, str(i)][i % 3 == 0] for i in a]</p>

<p>

 

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

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

 

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

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인