본문 바로가기

파이썬

리스트 표현식(List Comprehension)

파이썬에서 반복문을 사용할 때, for 문이나 while 문을 사용하는데,

리스트표현식을 사용한다면 여러 줄의 반복문을 사용하지 않고 한번에 반복문을 리스트에 집어 넣을 수 있습니다! 

리스트 표현식의 다양한 활용방법을 나름대로 정리하였습니다.

매우 강력한 표현 방법이니, 아래 정리된 내용을 읽고 직접 코드를 작성해 보시기 바랍니다: ) 

0. 리스트 표현식 이해의 첫 단계 : "조건부 표현식"
조건문이 참인 경우 if 조건문 else 조건문이 거짓인 경우
score = int(input())
if score > 60 :
    print("S")
else :
    print("F")

위와 같은 if - else 문은 아래와 같은 4줄의 코드가 필요합니다.

if 조건식 :
조건문이  참인 경우
else : 
조건문이 거짓인 경우
score=int(input())
result = "S"if score > 60 else "F"
print(k)​

조건부 표현식을 사용하면 ":"콜론 없이 한줄로 코드 작성이 가능합니다. 한줄로 작성이 가능하기 때문에 print 함수 등과 함께 사용하면 더욱 깔끔한 코드를 작성할 수 있습니다.

 

 

1. 리스트 표현식 기본 표현 방법

위에서 살펴본 조건부 표현식이 조건문을 한줄로 작성했던 것처럼, 리스트를 이용하여 for문을 한줄로 작성하는 것이 바로 리스트 표현식입니다.
(딕셔너리를 이용하여 for문을 한줄로 작성하는 것은 딕셔너리 표현식이며, 원리는 동일함)

[      f(x)     for     x      in     반복할 리스트   ]

반복할 리스트 안의 원소 x 를 반복해서 꺼낸 후, x를 변수로 하는 함수 f(x) 를 새로운 리스트에 집어 넣는다.

a= [ x for x in range(10)]
a

위 코드의 결과는 아래와 같습니다.

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

 

2. for 문 중첩 사용 방법
[     [ f(x)    for           in      변수 y에 대한 리스트  ]   for     y    in     리스트]

for 문을 중첩해서 사용하는 경우도, for문을 한번 적용하는 방법과 동일합니다.

  1. 리스트에서 원소 y를 꺼내고, y를 변수로 하는 함수(밑줄친 부분)를 반복합니다.
  2. 변수 y에 대한 리스트에서 원소 x를 꺼내 x에 대한 함수를 반환 합니다! (빈리스트, append 함수 사용할 필요 없음)
x=[]
for i in range(5):
    for j in range(5):
        x.append((i,j))
        
x=[(i,j) for i in range(5) for j in range(5)]

위의 for 문과 아래 리스트 x는 동일한 결과값을 출력합니다.

i 와 j는 0부터 4까지 반복하므로 (i,j)는 (0,0~4), (1,0~4), (2,0~4), (3,0~4),(4,0~4)를 출력합니다.

[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4)]

이를 응용하면 구구단을 출력하는 반복문을 한줄로 작성할 수 있습니다.

# 1) for 문 중첩사용하여 구구단 만들기
for i in range(2,10):
    for j in range(2,10):
        print(f"{i}*{j}={i*j}",end=" ")
# 2) 리스트 표현식 활용한 중첩 for 문
a=[f"{i}*{j}={i*j:2}" for i in range(2,10) for j in range(2,10)]
print(a)

위 두 코드는 구구단을 반환하는 동일한 코드입니다!

이 코드를 통해 알 수 있는 점은 아래와 같습니다.

  1. 중첩 for 문을 append함수 없이 바로 리스트에 넣을 수 있다
  2. 더 간결하게 작성할 수 있다.
  3. f(x) 부분 ( 위 코드의 [f"{i}*{j}={i*j:2}" 부분)에 f-string을 적용할 수 있다

 

 

3. for 문과 if 문의 중첩 사용
 조건문이 참인 경우    if     조건문    else     조건문이 거짓인 경우     for      x      in    리스트   ]

[   for      x      in    리스트 
    조건문이 참인 경우    if     조건문   else   조건문이 거짓인 경우      ]

밑줄 친 부분은 위에서 살펴본  '조건부 표현식' 이고, 색칠된 부분은 for 문입니다.

위의 내용을 충분히 이해했다면, for문과 if 문을 중첩해 사용하는 것은 어렵지 않습니다.

중복 for문을 사용한 아래 x와 y리스트의 결과값을 비교해 보겠습니다.

x=[(i,j) for i in range(5) for j in range(5)]
y=[(i,j) for i in range(5) for j in range(5) if i==j]
print(x)
print(y)
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4)]
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]

y는 x 리스트의 결과 값 중 조건 ( i == j ) 를 만족하는 결과값만 리스트의 원소로 담은 것을 확인 할 수 있습니다!

하지만 클린코드 작성의 원칙으로 인해 리스트 표현식 한줄 보다는 여러줄의 반복문이 가독성이 더 좋으므로

무작정 한줄로만 쓰려고 해서는 안됩니다 ㅎㅎ

'파이썬' 카테고리의 다른 글

복소수  (0) 2022.08.17
++, --, +=,-=,*= 그리고 a,b = b,a (swap)  (0) 2022.08.09
파이썬 클래스  (0) 2022.08.06
파이썬 정규표현식  (0) 2022.08.06
파이썬 print 함수 응용(sep, end,\n,f-string)  (0) 2022.07.27