betterway28컴프리헨션2

김승환·2021년 7월 11일

코딩의 기술

목록 보기
19/36

컴프리헨션 내부에 제어 하위 식을 세 개 이상 사용하지 말라

  • 컴프리헨션은 기본적인 사용법 외에도 루프를 여러 수준으로 내포하도록 허용한다,
# ex) 리스트 안에 리스트가 들어 있는 형태로 정의한 행렬을 모든 원소가 들어있는
#평평한 단일 리스트로 단순화하고 싶다고 하자.
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단계 깊이로 구성된 입력 list 구조를 복제하는 경우를 들 수 있다.

#[]가 들어가지만 여전히 읽기엔 아직 괜찮다.
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], [1, 2, 3]],
    [[4, 5, 6], [7, 8, 9]],
]
flat = [x for sublist1 in my_lists
        for sublist2 in sublist1
        for x in sublist2]
# 3단계부터는 일반 루프문을 사용한 코드다.
#
flat = []
for sublist1 in my_lists:
    for sublist2 in sublist1:
        flat.extend(sublist2)

컴프리헨션은 여러 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]

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y=[]
for x in a:
    if x>4:
        if x%2==0:
            y.append(x)
print(y)

[6, 8, 10]

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

[6, 8, 10]

각 수준의 for 하위 식의 바로 뒤에 if를 추가함으로써 각 수준마다 조건을 지정할 수 있다

#예를들어 행렬에서 3으로 나눠 떨어지는 셀만 남기고, 
#함계가 10보다 큰 행만 남기고 싶다고 하자.
#리스트 컴프리헨션을 사용해 표현하면 코드가 길어지지는 않지만, 읽기가 매우 힘들어진다.

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문을 사용하고 도우미 함수를 작성하라

profile
인공지능 파이팅!

0개의 댓글