Python 강좌 : 제 19강 - 간소화
간소화(Comprehension)
간소화(Comprehension)
란 반복 가능한 객체(iterable)들을 축약한 형태으로 생성하는 방법입니다.
대표적으로 리스트(List)
, 튜플(Tuple)
, 집합(Set)
사전(Dict)
, 생성자(Generator)
등이 있습니다.
즉, List
나 Tuple
등을 한 줄로 생성하여 간소화할 수 있습니다.
반복 가능한 객체들을 간소화하게 되면 코드 구성이 깔끔해져 더 읽기 쉬운 코드를 구성할 수 있습니다.
또한, 조건문
등을 추가하여 코드를 간략화 할 수 있습니다.
List Comprehension
- 결과
- [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[리스트 값 for 변수 in 범위]
를 이용하여 범위
만큼 반복하여 변수
를 할당해 리스트에 리스트 값
을 채웁니다.
range(10)
은 0~9
의 값을 지니고 있으며 i
에서 각각의 값들을 호출합니다.
for
문을 통해 반복
하게 되어 리스트 값
을 조건에 맞게 채우게됩니다.
Comprehension + if
- 결과
- [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
부터 값을 호출합니다.
조건에는 and
나 or
등을 포함하여 조건식
을 추가할 수 있습니다.
또한, 간소화 구문에는 삼항 연산자(Ternary operators)
를 적용할 수 있습니다.
참 값 if 조건 else 거짓 값
의 형태로 값이 반환되므로, 리스트 값
영역에 참 값 또는 거짓 값을 할당할 수 있습니다.
Multiple Comprehension
- 결과
- [‘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
- 결과
- (0, 7, 6, 9, 2, 3)
Tuple
은 다른 간소화와 다르게, 명시적으로 tuple()
로 변경해야 합니다.
소괄호를 사용한 간소화는 생성자 표현(Generator Expression)
입니다.
생성자는 반복 가능한(iterable) 형식으로 반환할 수 있습니다.
그러므로, 생성자(Generator)를 tuple()
로 변경해 사용합니다.
Set Comprehension
- 결과
- {‘E’, ‘Y’, ‘N’, ‘D’, ‘A’, ‘H’, ‘U’}
{‘E’, ‘Y’, ‘N’, ‘D’, ‘A’, ‘H’, ‘U’}
간소화
을 이용할 때, 범위
를 문자열
로 사용하여 문자 값을 직접 할당할 수 있습니다.
또한 Set
의 연산이 필요할 때, Set Comprehension
를 이용한다면 S1
에서 사용된 List → Set
구간을 줄여 전체적인 연산량을 감소시킬 수 있습니다.
Dictionary Comprehension
- 결과
- {‘c’: 1, ‘h’: 1, ‘e’: 3, ‘s’: 1}
List
이외에도 Dictionary Comprehension
를 이용하여 사전을 간소화할 수 있습니다.
{key : value for 변수 in 범위}
를 이용하여 범위
만큼 반복하여 변수
를 할당해 key
값과 value
값을 채웁니다.
key
에는 문자
가 담겨있으며 value
에는 문자의 개수
가 담겨있습니다.
댓글 남기기