🧐 🤔 그거 어떻게 쓰더라 🙄 😙

파이썬 컴프리헨션

2022. 7. 31. Evergood Kim이가 씀
list1 = [ x로나타낸표현식  for x in x가차례로가질값목록이터러블 ]
list1 = [ x로나타낸표현식  for x in x가차례로가질값목록이터러블  if 조건 ]
list1 = [ x랑y로나타낸표현식  for x in  x가차례로가질값목록이터러블  if 조건  for y … ]

리스트, 집합, 딕셔너리 디스플레이에서; 요소를 일일이 나열하는 대신; 반복과 조건으로 계산된 값들을 넣는다. 학교 다닐 때 수학에서 집합을 표시하는 방법이라고 배운 것 중에 원소나열법과 조건제시법이 있었는데; 흔히 쓰는 [1,2,3]은 원소나열법이고 이건 조건제시법 같다.

컴프리헨션

for절: 반복할 요소

이런 식으로; 어떤 규칙이나 공통요소로 나타내지는 멤버들을 나열하고 싶을 때

l = [ 0**2, 1**2, 2**2, 3**2, 4**2 ]

만약 for문으로 이 나열을 나타낸다면 이럴 것이다.

l = []
for x in range(5):
    l.append(x**2)

for문을 디스플레이(대괄호) 안에 넣어버리자는 기발한 아이디어.

l = [ x**2 for x in range(5) ]

if절: 조건 추가

for절 뒷부분에 if절으로 조건을 붙인다.

# 3의 배수가 아닌 i에 대해서만 i**2 나열
l = [ i**2 for i in range(10) if i%3 != 0 ]
# [1, 4, 16, 25, 49, 64]

중첩

for절 중첩

for문도 중첩해서 쓰듯이 여기 for절중첩한다.

l = [ a,b,c로 어쩌구 for a … for b … for c … ]

왼쪽은 느긋하게 크게크게 돌고 오른쪽이 빠릿빠릿하이 깨작깨작 먼저 돈다.

l = [ 100*i+k for i in range(1,4) for k in range(3) ]

# [100, 101, 102, 200, 201, 202, 300, 301, 302]

앞 for절의 변수가 뒤 for절에서 보인다. 앞에선 뒤가 안 보인다. (스코프보단 순서의 문제인 듯)

l = [ … for i in range(5) for k in range(i) ]

l = [ … for i in range(k) for k in range(3) ]  # 오류

컴프리헨션의 중첩: 2차원 배열 만들기

2차원 배열이란; 배열이 멤버인 배열이다. 컴프리헨션이 표현식인 컴프리헨션도 가능하다.

위의 for절 중첩에서는 왼쪽이 더 늦게 돈다고 했지만; 아래 예시에선 괄호 안의 컴프리헨션과 괄호 밖의 컴프리헨션이 각각 별개이고, 당연히 괄호 안이 먼저이다.

l = [
    [ 0,  1,  2,  3,  4],
    [10, 11, 12, 13, 14],
    [20, 21, 22, 23, 24]
]

l = [
    [00+i for i in range(5)],
    [10+i for i in range(5)],
    [20+i for i in range(5)]
]

l = [
    [10*k+i for i in range(5)] for k in range(3)
]

l = [ [반복할 행] for … ]

딕셔너리의 컴프리헨션

딕셔너리는 키:값 한 쌍이라서 컴프리헨션도 키:값으로 넣나 보다.

{ 결과키표현식 : 결과값표현식 for 입력키변수, 입력값변수 in 딕셔너리.items() }

제너레이터 표현식

컴프리헨션을 괄호로 감싼다. 해당 컴프헨션으로 제너레이터를 만들어 반환한다.

728x90