<aside> 💡
마케터가 되면 다양한 채널을 통해 유입된 고객 데이터를 수집하고 분석하게 된다.
그런데 일부 고객 식별 정보(예 : 가입 코드, 고객 ID)가 한글 숫자와 아리비아 숫자가 혼합된 형식으로 입력되어 있다.
고객 세분화 및 분석 자동화 과정에 오류가 발생할 가능성이 있다.
따라서 고객 정보를 모두 아라비아 숫자로 변환하는 전처리 작업을 해야 하는 상황이다.
한글 숫자와 아라비아 숫자가 혼합된 고객 코드 문자열이 주어졌을 때,
모든 숫자를 아라비아 숫자로 변환하는 코드를 작성해보자.
(예시 : "삼5이사" → "3524")
</aside>
# 고객 코드 목록
customer_ids = [
"삼5이사",
"0오6칠",
"48삼구",
"이74팔",
"9일이삼" ]
# 한글 숫자 : 아라비아 숫자 딕셔너리
korean_to_num = {
"공": "0", "일": "1", "이": "2", "삼": "3", "사": "4",
"오": "5", "육": "6", "칠": "7", "팔": "8", "구": "9"}
<aside> 1️⃣
for code in customer_ids:
converted_code = ""
for i in code:
for korean, num in korean_to_num.items():
if i in korean: # 첫 번째 if에서 i값이 num으로 바뀌기 때문에 두 번째 if문이 무조건 실행된다.
i = num
converted_code += i
if i in num:
converted_code += i
print(f"[{code}]에 대한 고객 코드는 [{converted_code}]입니다.")
i 가 num으로 바뀌었기 때문에 두 번째 if 문도 무조건 실행된다.
</aside>
<aside> 2️⃣
첫 번째 if 문이 실행되었다면 두 번째 if 문은 실행되지 않도록 조치가 필요했다.
그 방법으로 **break**를 걸어주는 것을 선택했다.
for code in customer_ids:
converted_code = ""
for i in code:
for korean, num in korean_to_num.items():
if i in korean:
i = num
converted_code += i
break #첫 번째 if문 실행 후, 두 번째 if문이 실행되지 않도록 break를 걸어준다.
if i in num: #하지만, 전체적으로 더 간결하게 처리하는 것을 고려해보면 좋다.
converted_code += i
print(f"[{code}]에 대한 고객 코드는 [{converted_code}]입니다.")
break를 걸어주니 원하는 결과값으로 데이터를 전처리 할 수 있었다.
<aside> 3️⃣
더 간결하게 해결하는 방법은 딕셔너리에서 키값만을 이용하는 것이다.
어떤 값이 딕셔너리의 key에 있는지 확인하는 방법을 사용하면 된다.
[딕셔너리에서 KEY를 검색하는 코드]
my_dict = {"a": 1, "b": 2, "c": 3}
"a" in my_dict # ✅ True
"z" in my_dict # ❌ False
딕셔너리에 해당 key 값이 있는지 확인해보는 방법은 in 연산자를 활용하는 것이다.
in연산자는 딕셔너리의 key 에 대해서만 직접 작동한다.
그렇다면 value를 검색할 때는 어떻게 작성해야 할까?
[딕셔너리에서 value를 검색하는 코드]
1 in my_dict.values() # ✅ True
5 in my_dict.values() # ❌ False
in 연산자 앞에 찾으려는 value 를 입력하고, .values() 메서드를 사용해야 한다.
딕셔너리에서 key를 검색하는 코드로 작성한다면 코드를 더욱 간결하게 작성할 수 있을 것이다.
for code in customer_ids:
converted_code = ""
for i in code:
if i in korean_to_num:
converted_code += korean_to_num[i]
else:
converted_code += i
print(f"[{code}]에 대한 고객 코드는 [{converted_code}]입니다.")
customer_ids 리스트에서 뽑은 문자형 데이터를 code에 하나씩 담아주고, 문자 하나씩i 에 담아주었다.i 가 korean_to_num 딕셔너리의 key에 있다면 converted_code 에는 korean_to_num 딕셔너리의 i 를 key로 가지는 value 데이터가 추가된다.i 가 korean_to_num 딕셔너리의 key에 없다면 i 를 converted_code에 그대로 추가한다.➡️ 딕셔너리의 key 를 찾아 value 값을 사용하는 방법으로 코드를 더 간단히 작성할 수 있었다.
</aside>
<aside> 📘
내가 인지하지 못한 개념 정리 : 딕셔너리의 메서드
| dict.items() | 딕셔너리의 모든 (key,value) 쌍을 반환 |
|---|---|
| dict.keys() | 딕셔너리의 모든 key를 반환 |
| dict.values() | 딕셔너리의 모든 value를 반환 |
my_dict = {"a": 1, "b": 2, "c": 3}
print(my_dict.keys()) # dict_keys(['a', 'b', 'c'])
print(my_dict.values()) # dict_values([1, 2, 3])
print(my_dict.items()) # dict_items([('a', 1), ('b', 2), ('c', 3)])
여기에서 .values()로 나온 값은 단순 리스트는 아니고, dict_values 라는 뷰 객체를 반환하지만 리스트처럼 in, for, list() 등에 사용할 수 있다.
1 in my_dict.values() # ✅ True
for v in my_dict.values():
print(v) # 1, 2, 3
</aside>