본문 바로가기

DEVELOP_NOTE/Python

[REFACTORING] dictionary에 'key' 존재 유무에 따른 데이터 채우기

As-Is

: 데이터프레임에서 특정 컬럼들의 값을 for문을 통해 불러와, 특정 key(patient_code, seq_no)의 유무를 체크해 dictionary내의 값을 채움

# 조회용 Dict 생성
search_col = ['patient_code', 'seq_no', 'disease_code', 'atc_set', 'prescription_date', 'diagnosis_date', 'sex', 'age', 'weight', 'bmi', 'a1c', 'scr', 'egfr']
transform_dict = {}
for patient_code, seq_no, disease_code, atc_set, prescription_date, diagnosis_date, sex, age, weight, bmi, a1c, scr, egfr in tqdm(data[search_col].values):
    if patient_code not in transform_dict:
        transform_dict[patient_code] = {
            seq_no : {
                'disease_code' : disease_code,
                'atc_set' : atc_set,
                'prescription_date' : prescription_date,
                'diagnosis_date' : diagnosis_date,
                'sex' : sex,
                'age' : age,
                'weight' : weight,
                'bmi' : bmi,
                'a1c' : a1c,
                'scr' : scr,
                'egfr' : egfr
            }
        }
    else :
        transform_dict[patient_code][seq_no] = {
            'disease_code' : disease_code,
            'atc_set' : atc_set,
            'prescription_date' : prescription_date,
            'diagnosis_date' : diagnosis_date,
            'sex' : sex,
            'age' : age,
            'weight' : weight,
            'bmi' : bmi,
            'a1c' : a1c,
            'scr' : scr,
            'egfr' : egfr
        }

 

문제점

1. dictionary내부의 값들을 채우는데, 각 항목들에 대해 반복적으로 정의하는 구문이 포함되어 있다.(코드길이가 길어짐)

2. 불필요한 if/else 문 존재

3. for문에서 출력되는 iteration value의 변수를 일일이 정의하고있음(필요한 것만 정의하면 될텐데..)

 

To-Be

: iteration value중 필요한 부분만 정의하고, setdefault를 통해서, dictionary의 key 존재유무에 따른 값채우기를 간결한 코드로 대체할 수 있다.

search_col = ['patient_code', 'seq_no', 'disease_code', 'atc_set', 'prescription_date', 'diagnosis_date', 'sex', 'age', 'weight', 'bmi', 'a1c', 'scr', 'egfr']
transform_dict = {}

for values in tqdm(data[search_col].values):
    patient_code, seq_no, *rest = values
    transform_dict.setdefault(patient_code, {})[seq_no] = dict(zip(search_col[2:], rest))