[Python] Skill of coding - 리스트컴프리헨션

Hyeseong·2020년 12월 9일
0

python skill of coding

목록 보기
1/18
post-thumbnail

리스트 컴프리헨션에서 표현식을 두개 넘게 쓰지 않기

리스트 컴프리헨션은 다중 루프를 이용 할 수 있어요. 예를들어 행렬을 모든 셀이 포함되 ㄴ평평한 리스트 하나로 간략화한다고 가정해보조.
다음은 for표현식 두개를 사용한 리스트 컴프리헨션이에요

matrix = [
    [1,2,3],
    [4,5,6],
    [7,8,9],
]
flat = [x for row in matrix for x in row]
print(flat)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

또 다른 사용법은 입력 리스트의 레이아웃을 두 레벨로 중복해서 구성하는 것이다.
예를 들어 2차원 행렬의 각 셀에 있는 값의 제곱을 구한다고 해볼게요.

squared = [[x**2 for x in row] for row in matrix]
print(squared)
[[1, 4, 9], [16, 25, 36], [49, 64, 81]]

이 표현식을 다른 루프에 넣는다면 리스트 컴프리헨션이 여러 줄로 구분해야 할 정도로 길어진다.

my_lists = [
    [[1,2,3]],
    [[4,5,6]],
    [[7,8,9]]
]
flat = [
    x for sublist1 in my_lists
    for sublists2 in sublist1
    for x in sublists2
]
print(my_lists)
[[[1, 2, 3]], [[4, 5, 6]], [[7, 8, 9]]]

들여쓰기를 사용하여 보다 컴프리헨션을 이해하기 쉬워요.

my_lists = [
    [[1,2,3]],
    [[4,5,6]],
    [[7,8,9]]
]
flat = []
for sublist1 in my_lists:
    for sublists2 in sublist1:
        flat.extend(sublists2)

print(flat)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

다중 if조건을 지원한다. 같은 루프 레벨에 여러 조건이 있으면 암시적인 and 표현식이 된다. 예를 들어 숫자로 구성된 리스트에서 4보다 큰 짝수 값만 가지고 온다면 다음 두 리스트 컴프리헨션은 동일하다

a = [1,2,3,4,5,6,7,8,9,10]
b = [x for x in a if x > 4 if x % 2 == 0]
c = [x for x in a if x > 4 and x % 2 == 0]
print(a)
print(b)
print(c)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[6, 8, 10]
[6, 8, 10]

조건은 루프의 각 레벨에서 for 표현식 뒤에 설정할 수 있다. 예를들어 행렬에서 로우의 합이 10이상이고 3으로 나누어 떨어지는 셀을 구한다고 하자. 다음처럼 리스트 컴프리헨션으로 표현하면 간단하지만 이해하기가 매우 어렵다.

matrix = [
    [1,2,3],
    [4,5,6],
    [7,8,9],
]
filtered = [
    [x for x in row if x % 3 == 0]
    for row in matrix if sum(row) >=10
]
print(filtered)
[[6], [9]]

나해한 예지만 실제로 이런 표현식이 적합해 보이는 상황을 마주치게 될 것이다. 하지만 이런 리스트 컴프리헨션은 피하라고 강력히 말하고 싶다 이런 코드는 다른 사람들이 이해하기가 매우 어렵다. 몇 줄을 절약한 장점이 나중에 겪을 어려움보다 크지는 않다.

일반적으로 리스트 컴프리헨션을 사용할 때 표현식이 두 개를 넘어가면 피하는것이 좋다. 조건 두 개 , 루프 두 개, 혹은 조건 한 개와 루프 한개 정도면 된다.
이것보다 복잡해지면 일반적인 if문과 for문을 사용하고 헬퍼함수를 작성해야한다.(헬퍼함수 : 리스트를 반환하는 대신 제너레이터로)

정리

  • 리스트 컴프리헨션은 다중 루프와 레벨별 다중 조건을 지원함
  • 표현식이 두 개가 넘게 들어 있는 리스트 컴프리헨션은 이해하기 어려우므로 피해야함

```python
profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글