본문 바로가기
TIL(Today I learned)/파이썬 활용 전처리

Chapter 2. 파이썬 데이터 구조(Part 1. 데이터 핸들링)

by DOTMAKER 2021. 4. 27.

주요 코드만 리뷰하겠습니다.


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를 만들었다.