주요 코드만 리뷰하겠습니다.
1. 리스트와 튜플
# 리스트 순회 속도 측정:
import time
start_time = time.time()
for val1 in large_L:
pass
end_time = time.time()
print(end_time - start_time)
# 튜플 순회 속도 측정: 데이터가 큰 경우는 리스트로 작업한 후, 튜플로 자료형을 바꾸고 순회를 하게 된다.
start_time = time.time()
for val2 in large_T:
pass
end_time = time.time()
print(end_time - start_time)
위 코드로 순회 속도 측정 결과 튜플이 0.001초 더 빨랐습니다. 때문에 요소 변경이 필요 없고 단순 결과 도출만을 목적으로 할 때는 튜플을 사용해야 합니다.
# 함수의 가변 인자로 사용
def f(*x): # *: 인자수가 정해지지 않았음을 의미
print("입력된 데이터의 타입:{}".format(type(x)))
sum_x = 0
product_x = 1
for val in x:
sum_x += val
product_x *= val
return sum_x, product_x
S, P = f(1, 2, 3, 4, 5) # 출력을 각각 S와 P로 받음 # 함수 가변 인자에는 몇개의 숫자를 넣더라도 상관이 없다. 이 경우 데이터는 튜플로 받게 된다.
print(S, P)
튜플은 가변 인자로 사용 가능합니다. 인자수가 정해지지 않은 경우 여러 개의 인자를 받을 때 튜플의 형태로 받아줍니다.
2. 딕셔너리
# 값들 리스트화 시키기.
print(list(dic.keys()))
print(list(dic.values()))
print(list(dic.items()))
대표적인 사전 관련 함수는 이 세가지입니다. 중요한 것은 객체가 생성될 때, 리스트로 생성되지 않습니다. 따로 리스트화가 필요합니다.
items() 함수는 for 구문에서 자주 사용됩니다. key값과 value값을 for 문을 통해 순회할 때가 그 예입니다.
3. iterator 객체 생성 함수
3.1 range
range(start, end, step) ---> 얼만큼 건너뛰어서 어디서부터 어디까지인가?
- 주의할 점은 end 값을 포함하지 않는다. 그리고 개수라고 생각하지 않는다. step에 따라 개수가 달라질 수 있다.
3.2 itertools 함수
3.2.1 itertools.product(순회 가능 객체들) ---> 순회 가능한 여러개의 객체를 순서대로 순회하는 이터레이터 생성
for a, b, c in itertools.product(range(5), range(5), range(5)):
print(a, b, c)
순회의 우선순위는 a , b, c 순서이다. a값이 정해지고, b값이 정해지면, 마지막으로 c전체를 순회한다.
다음은 그 다음 b값을 가지고 c전체를 순회한다. 이 과정들이 모든 값들을 순회할 때까지 반복된다.
전체 결과 개수는 각각 순회 가능 객체 개수들의 곱이다.
이 코드는 밑 코드와 같게 된다. 그렇다면 nested for 문보다 나은 점은? 속도가 더 빠르다.
for a in range(5):
for b in range(5):
for c in range(5):
print(a, b, c)
3.2.2 itertools.combinations(전체 수, 선택 수), itertools.permutations(전체 수, 선택 수)
L = ['a', 'b', 'c', 'd']
for r in range(1, len(L) + 1): # 1부터 시작하여서 4까지 출력하고 싶은 상황
for comb in itertools.combinations(L, r): # 1개,2개, 3개, 4개 조합을 뽑고 싶은 상황.
print(comb)
for r in range(1, len(L)+1):
for comb in itertools.permutations(L, r):
print(comb)
4. List comprehension
바로 조건에 맞는 리스트를 만들어 내는 방법이다.
L3 = [x**2 for x in range(10) if x%2 == 0] # 2로 나눈 나머지가 0인 값만 제곱 변환하여 리스트에 넣어라.
# [0, 4, 16, 36, 64]
X = [1, 2, 3, 'a', 'b']
Y = [3, 1, 2, 'c', 4]
L4 = [x + y for x, y in itertools.product(X, Y) if type(x) == type(y) == int]
# x, y 조합 중에서 타입이 정수로 똑같은 경우만 더해서 리스트에 더하라. product를 사용하면 굳이 for문을 두개 쓸 필요가 없구나
# [4, 2, 3, 5, 5, 3, 4, 6, 6, 4, 5, 7]
5. Dict comprehension
dic = {1:'NaN', 2:2, 3:4, 4:'NaN'}
dic2 = {x:y for x, y in dic.items() if y != 'NaN'} # dic 재분리 후 조건에 맞는 것만 골라내기. 밑 코드와 비교하면, 굳이 빈 딕셔너리를 생성할 필요가 없고 이것에 조건에 맞는 값을 추가할 필요가 없다.
#{2: 2, 3: 4}
앞서 살펴 본 items() 함수와 if 구문을 통해 새로운 dict를 만들었다.
'TIL(Today I learned) > 파이썬 활용 전처리' 카테고리의 다른 글
| Chapter 1. 왜 전처리가 중요한가요?(Part 1. 데이터 핸들링) (0) | 2021.04.27 |
|---|