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