Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 딕셔너리
- Python
- 하둡
- 결정계수
- 분포
- 데이터프레임
- DataFrame
- dict
- cross validation
- hive
- 유사도
- SPLIT
- Sawzall
- list
- k-means
- pca
- 교차검증
- T-검정
- merge
- p-value
- DBSCAN
- SQL on 하둡
- pig
- 가설검정
- 병렬 쿼리 시스템
- 밀도기반
- distribution
- 다중공선성
- 분산분석
- join
Archives
- Today
- Total
one of a kind scene
[Python] Comprehension에 대해서 본문
Comprehension¶
- 리스트, 셋, 딕셔너리 를 쉽게 만드는 Comprehension에 대해서 공부하고자 함
- Python에 기본 자료형으로는 튜플, 리스트, 셋, 딕셔너리가 있는데, 이 중에서 튜플만 Comprehension이 없음
- 한국어로는 지능형 튜플, 지능형 리스트 등으로 표현하기도 한다
1) List Comprehension(LC)¶
1-1) 일반적인 LC¶
In [1]:
# 20까지의 짝수를 출력하기 위해 다음과 같은 LC를 사용할 수 있다
evens = [x * 2 for x in range(11)]
print(evens)
In [2]:
# 리스트의 모든 원소값을 정규화 시킨 후 상수값을 더하는 LC
values = [32, 12, 96, 42, 32, 93, 31, 23, 65, 43, 76]
total = sum(values)
normalization = [(x / total) + 1 for x in values]
print(normalization)
1-2) 좀 더 복잡한 LC¶
- 1) if문(=조건)을 지닌 LC
- 2) Nested LC
In [3]:
# if문을 활용하여 제곱근이 정수가 아닌 경우를 찾는 LC
from math import sqrt
non_squars = [x for x in range(101) if sqrt(x)**2 != x]
print(non_squars)
In [4]:
# 두 리스트의 원소들의 모든 조합을 찾는 LC
# 참고로 epithets는 별칭을 뜻함
epithets = ['sweet', 'annoying', 'cool', 'grey-eyed']
names = ['john', 'alice', 'james']
epithet_names = [(e, n) for e in epithets for n in names]
print(epithet_names)
1-3) practical LC 예제¶
- 1) 1~30까지 숫자중에 피타고라스 방정식의 해를 찾는 LC
- 2) 단어에서 모음을 제거하는 LC
- 3) Nested LC를 flatten하게 만드는 LC
In [5]:
# a^2 + b^2 = c^2 (a < b < c)를 만족하는 피타고라스 방정식의 해를 찾는 LC
solutions = [(x, y, z) for x in range(1, 30) for y in range(x, 30) for z in range(y, 30) if x**2 + y**2 == z**2]
print(solutions)
In [6]:
# 단어에서 모음을 제거하는 LC
word = 'mathematics'
without_vowels = ''.join([c for c in word if c not in ['a', 'e', 'i', 'o', 'u']])
print(without_vowels)
In [7]:
# 행렬을 일차원화 시키는 LC
# matrix에서 한행씩 가져와서 행에 있는 value들을 가져옴
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
]
flatten = [e for r in matrix for e in r]
print(flatten)
In [ ]:
2) Set Comprehension(SC)¶
- LC와 정확히 동일하며 단지 list가 아닌 set을 생성한다는 것만 다르다.
In [8]:
# 다음의 LC는 중복된 값들을 포함한다
no_primes = [j for i in range(2, 9) for j in range(i * 2, 50, i)]
print(no_primes)
In [9]:
# SC를 사용하면 중복값이 없는 집합을 얻을 수 있다
no_primes = {j for i in range(2, 9) for j in range(i * 2, 50, i)}
print(no_primes)
In [ ]:
3) Dict Comprehension(DC)¶
- LC와 동일하며 dict를 생성한다.
- 1) 두 리스트를 하나의 dict로 합치는 DC
- 2) 튜플로 구성된 리스트를 dict 형태로 변환하는 DC
In [10]:
# 두 리스트를 하나의 dict로 합치는 DC. 하나는 key, 또 다른 하나는 value로 사용한다
subjects = ['math', 'history', 'english', 'computer engineering']
scores = [90, 80, 95, 100]
score_dict = {key: value for key, value in zip(subjects, scores)}
print(score_dict)
In [11]:
# 튜플 리스트를 dict 형태로 변환하는 DC
score_tuples = [('math', 90), ('history', 80), ('english', 95), ('computer engineering', 100)]
score_dict = {t[0]: t[1] for t in score_tuples}
print(score_dict)
In [ ]:
(번외) Generator Expression (GE)¶
- Generator expression은 특별한 형태의 comprehension
- 한 번에 모든 원소를 반환하지 않고 한 번에 하나의 원소만 반환하는 generator를 생성
- GE 또한 다른 Comprehension과 동일한 형태로 쉽게 사용할 수 있다.
In [12]:
# 다음 Generator는 제곱수를 만들어낸다
gen = (x**2 for x in range(10))
print(gen)
In [13]:
print(next(gen)) # call 1
print(next(gen)) # call 2
print(next(gen)) # call 3
print(next(gen)) # call 4
print(next(gen)) # call 5
print(next(gen)) # call 6
print(next(gen)) # call 7
print(next(gen)) # call 8
print(next(gen)) # call 9
print(next(gen)) # call 10
# 여기까지 'next' 함수를 활용해서 호출을 10번 반복
# 11번째에서는 error가 발생
print(next(gen)) # call 11
In [14]:
# Yes, it is an just generator. You can sum the yielding values.
# GE로 생성한 Generator도 yield를 가진 함수로 생성한 것과 동일한 Generator이기 때문에,
# 똑같이 sum을 사용할 수 있다. (iterable 객체)
gen = (x**2 for x in range(10))
sum_of_squares = sum(gen)
print(sum_of_squares)
In [ ]:
In [ ]:
In [ ]: