상위 목록: 하위 목록: 작성 날짜: 읽는 데 22 분 소요

간소화(Comprehension)

간소화(Comprehension)반복 가능한 객체(iterable)들을 축약한 형태으로 생성하는 방법입니다.

대표적으로 리스트(List), 튜플(Tuple), 집합(Set) 사전(Dict), 생성자(Generator) 등이 있습니다.

즉, ListTuple 등을 한 줄로 생성하여 간소화할 수 있습니다.

반복 가능한 객체들을 간소화하게 되면 코드 구성이 깔끔해져 더 읽기 쉬운 코드를 구성할 수 있습니다.

또한, 조건문 등을 추가하여 코드를 간략화 할 수 있습니다.



List Comprehension

L = [i ** 2 for i in range(10)]

print(L)
결과
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

[리스트 값 for 변수 in 범위]를 이용하여 범위만큼 반복하여 변수를 할당해 리스트에 리스트 값을 채웁니다.

range(10)0~9의 값을 지니고 있으며 i에서 각각의 값들을 호출합니다.

for문을 통해 반복하게 되어 리스트 값을 조건에 맞게 채우게됩니다.



Comprehension + if

L1 = [i ** 2 for i in range(10) if (i > 5)]

print(L1)

L2 = [i ** 2 for i in range(10) if (i > 5) and (i % 2 == 0)]

print(L2)

L3 = [i ** 2 if i < 5 else i for i in range(10)]

print(L3)
결과
[36, 49, 64, 81]
[36, 64]
[0, 1, 4, 9, 16, 5, 6, 7, 8, 9]

[리스트 값 for 변수 in 범위 if (조건)]을 이용하여 if (조건)을 추가해 조건식에 맞는 경우의 리스트를 생성할 수 있습니다.

if (i > 5)6 ~ 9의 값을 지니고 있으며 i에서 각각의 값을 호출할 때 5부터 값을 호출합니다.

조건에는 andor 등을 포함하여 조건식을 추가할 수 있습니다.

또한, 간소화 구문에는 삼항 연산자(Ternary operators)를 적용할 수 있습니다.

참 값 if 조건 else 거짓 값의 형태로 값이 반환되므로, 리스트 값 영역에 참 값 또는 거짓 값을 할당할 수 있습니다.



Multiple Comprehension

L = [['a', 'b', 'c'], ['d', 'e', 'f']]

flatten = [j for i in L for j in i]

print(flatten)

extend = [[j + j for j in i] for i in L]

print(extend)
결과
[‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’]
[[‘aa’, ‘bb’, ‘cc’], [‘dd’, ‘ee’, ‘ff’]]

간소화 구문은 여러 번 사용하여 반복할 수 있습니다.

L은 2차원 리스트로 구성되어 있어 1차원 리스트로 변환한다면 두 번의 반복문의 구성을 필요로 합니다.

여기서, 간소화 구문을 두 번 반복하여 1차원 리스트로 간단하게 변경할 수 있습니다.

기본적인 간소화 구문은 [i for i in L]의 형태를 갖습니다.

하지만, 이 구문은 [‘a’, ‘b’, ‘c’][‘d’, ‘e’, ‘f’]를 반복하므로 한 번 더 반복해야 합니다.

그러므로 i에 대한 반복문을 추가로 구성합니다.

[j for j in i]의 구성이 필요합니다. 여기서, 앞 부분이 아닌 뒷 부분에 연결합니다.

그러므로, [i for i in L]에서 반환 해줄 리스트 값은 j가 되므로 [j for i in L]로 먼저 변경합니다.

이후에, L 뒷 부분에 for j in i를 이어 붙여 [j for i in L for j in i] 형태로 구성합니다.

만약, 3차원 리스트를 평평하게 만든다면 위와 같은 방식으로 맨 앞의 j 대신에 k로 변겯한 다음, for k in j를 그대로 이어 붙이면 됩니다.

즉, [k for i in L for j in i for k in j]과 같은 구성이 됩니다.


다음으로는, 뒷 부분에 이어붙이는 방법이 아닌 앞 부분에 이어 붙이는 방법입니다,

이 방법은 차원을 그대로 유지한 상태로 값을 변경할 수 있습니다.

리스트에 채워질 i에 대해서 다시 간소화 구문을 반복하는 방법입니다.



Tuple Comprehension

data = [0, 7, 6, 9, 2, 3]

T = tuple((i for i in data))

print(T)
결과
(0, 7, 6, 9, 2, 3)

Tuple은 다른 간소화와 다르게, 명시적으로 tuple()로 변경해야 합니다.

소괄호를 사용한 간소화는 생성자 표현(Generator Expression)입니다.

생성자는 반복 가능한(iterable) 형식으로 반환할 수 있습니다.

그러므로, 생성자(Generator)를 tuple()로 변경해 사용합니다.



Set Comprehension

text = "YUNDAEHEE"

S1 = set([i for i in text])

print(S1)

S2 = {i for i in text}

print(S2)
결과
{‘E’, ‘Y’, ‘N’, ‘D’, ‘A’, ‘H’, ‘U’}
{‘E’, ‘Y’, ‘N’, ‘D’, ‘A’, ‘H’, ‘U’}

간소화을 이용할 때, 범위문자열로 사용하여 문자 값을 직접 할당할 수 있습니다.

또한 Set의 연산이 필요할 때, Set Comprehension를 이용한다면 S1에서 사용된 List → Set 구간을 줄여 전체적인 연산량을 감소시킬 수 있습니다.



Dictionary Comprehension

text = "cheese"

D = {i : text.count(i) for i in text}

print(D)
결과
{‘c’: 1, ‘h’: 1, ‘e’: 3, ‘s’: 1}


List 이외에도 Dictionary Comprehension를 이용하여 사전을 간소화할 수 있습니다.

{key : value for 변수 in 범위}를 이용하여 범위만큼 반복하여 변수를 할당해 key값과 value값을 채웁니다.

key에는 문자가 담겨있으며 value에는 문자의 개수가 담겨있습니다.

댓글 남기기