일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- yaml
- 코딩테스트
- Jar배포
- 프로그래머스
- PYTHON
- 함수
- 클래스
- Comprehension
- Django
- Postman
- 람다함수
- RDS
- numpy
- cerbot
- todo project
- mock server
- 파이썬
- EC2
- 집계함수
- self
- 토이프로젝트
- 백엔드 인턴십
- 조건연산
- API
- 프리온보딩
- spring boot
- 컴프리헨션
- 파이써닉코드
- 행렬곱
- sqlalchemy
- Today
- Total
build my life
[Python] 클래스 만들기 - 실습(3) 본문
문제 3.
다음과 같은 형태의 리스트를 입력받고 , key 이름들을 리스트로 입력 받아 dict 자료형을 생성하는 클래스를 만드시오
ex)
class DictDataset:
code context
data = [[1,2,3,4,5,6,7,8,9], [10,20,30,40,50,60,70,80,90]]
dict_dt = DictDataset(data,["col1","col2"])
dict_dt.dataset
Ouput:
{'col1': [1, 2, 3, 4, 5, 6, 7, 8, 9], 'col2': [10, 20, 30, 40, 50, 60, 70, 80, 90]}
내가 푼 코드)
output을 보면 두번째 인자로 들어간 1차원 리스트 ['col1', 'col2']가 key값이 되고 data가 value값이 된다는 걸 알 수 있다.
두개의 리스트를 dict형태로 만들기 위해 zip함수와 comprehension을 이용해서 문제를 해결해 보았다.
class DictDataset:
def __init__(self, data, key_name):
self.dataset = {k:v for k,v in zip(key_name, data)}
#self.dataset = dict(zip(keys,lst))
강사님 코드)
comprehension 방식을 쓰지 않고 더 간단하게 할 수 있다.
zip함수를 쓰는 건 동일하고 dict 형태로 바로 변환해주면 된다.
class DictDataset:
def __init__(self, data, key_name):
self.dataset = dict(zip(key_name,data))
문제 4.
위에 구현한 클래스에서 추가 메소드 head 메소드와 tail 메소드를 작성하세요.
1) head 메소드의 경우 인자값이 없을경우 dict의 모든 value의 앞에서 5개의 값들이 key 와 함께 dict 형태로 리턴되게 하세요
2) tail 메소드의 경우 인자값이 없을경우 dict의 모든 value의 뒤에서 5개의 값들이 key 와 함께 dict 형태로 리턴되게 하세요.(역순으로 출력되는 것이 아님!)
3) head , tail 모두 인자값이 주어질경우 인자값 개수만큼 value가 나오게 한다.
ex)
class DictDataset:
def __init__(self,lst,keys):
self.dataset = dict(zip(keys,lst))
dict_dt = DictDataset(data,["col1","col2"])
dict_dt.head()
Output:
{'col1': [1, 2, 3, 4, 5], 'col2': [10, 20, 30, 40, 50]}
dict_dt.head(3)
Output:
{'col1': [1, 2, 3], 'col2': [10, 20, 30]}
dict_dt.tail()
Output:
{'col1': [5, 6, 7, 8, 9], 'col2': [50, 60, 70, 80, 90]}
dict_dt.tail(3)
Output:
{'col1': [7, 8, 9], 'col2': [70, 80, 90]}
내가 푼 코드)
인자값만큼 value값을 가져온다는 것부터가 난관... 슬라이싱을 사용해야하는 걸 알았는데도 접근 자체를 못하고 있었다.
그러다가 comprehension을 통해 새로운 dict을 만들어보기로 했고, value값에만 슬라이싱을 적용하면 원하는 만큼 데이터를 가져올 수 있다..!!!!
그리고 인자값이 없을 경우의 조건에 따라 인자값이 없으면 None값으로 받는다고 파라미터 설정을 하고
if문을 통해 인자값이 없을 경우와 있을 경우를 나누어 dict을 반환했다.
class DictDataset:
def __init__(self, lst, keys):
self.dataset = dict(zip(keys, lst))
def head(self, n = None):
if n is None:
return {k:v[:5] for k,v in self.dataset.items()}
return {k:v[:n] for k,v in self.dataset.items()}
def tail(self, n = None):
if n is None:
return {k:v[-5:] for k,v in self.dataset.items()}
return {k:v[-n:] for k,v in self.dataset.items()}
처음엔 for k,v in self.dataset.items()가 아닌 zip(self.keys, self.lst)로 불러와서 새로운 데이터셋을 만들었었다..(이렇게 되려면 init메소드에 lst, keys를 인스턴스 변수 선언을 해줘야함 ^^)
items() 메소드(강사님의 힌트)를 기억해 냈더라면 더 시간이 안걸렸을 텐데,,, 다시 공부하자,,,
강사님 코드)
인자값이 없을 경우 value 5개씩 뽑아오는 거니까 n = 5로 할당해주면 되는 거였다..
if문도 안써도 되고 더 간단해진 코드!
class DictDataset:
def __init__(self, lst, keys):
self.dataset = dict(zip(keys, lst))
def head(self, n = 5):
return {k:v[:n] for k,v in self.dataset.items()}
def tail(self, n = 5):
return {k:v[-n:] for k,v in self.dataset.items()}
문제 5.
구현한 클래스에서 추가 메소드 rename 메소드를 작성하세요
딕셔너리를 입력 받아 인스턴스 변수인 dataset의 key의 값을 변경하는 메소드를 작성하세요.
ex)
dict_dt = DictDataset(data,["col1","col2"])
keys_rename = { "col1" : "num1", "col2" : "num2"}
dict_dt.rename(keys_rename)
dict_dt.dataset
Output:
{'num1': [1, 2, 3, 4, 5, 6, 7, 8, 9],
'num2': [10, 20, 30, 40, 50, 60, 70, 80, 90]}
이 문제는 아예 시도 조차 하지 못했다.. pop메소드를 이용해야지라는 생각은 했지만 이걸 어떻게 이용해야하는지를 몰랐다.
강사님과 함께 푼 답을 보니 왜 이걸 생각하지 못했을까!!!!!
def rename(self, keys_rename):
for k, v in keys_rename.items():
#k에 해당하는 value값들을 v를 키로 하는 value 값에 넣어준다.
self.dataset[v] = self.dataset.pop(k)
설명)
dict.pop() 메소드는 해당 key 값에 대한 value값을 반환한 후 삭제한다.
즉, keys_rename에는 key값으로 원래 dataset의 key값이 value값으로는 변경될 key값이 존재하니
for문을 이용해 keys_rename의 key, value값을 k,v에 넘겨준다.
마지막으로
dataset[k] (=dataset['col1'])에 해당하는 value = [ 1,2,3,4,5,6,7,8,9]를 dataset[v] (= dataset['num1']) 에 넘겨준다!
이걸 item마다 반복하면 원하는 output 출력 완료!
문제를 보면 어떤 메소드를 이용해서 문제를 해결해야지 생각이 들지만 적용을 잘 못한다는 걸 알게 되었다.
지금까지 배운 메소드들을 한번 더 복습하면서 어떻게 활용할 수 있는지를 계속해서 문제 풀이를 통해 고민해봐야겠다!
또한 처음부터 간단하게 쓰려고 하는 것보다 아직 코딩 실력이 주니어 주니어 하니 내가 할 수 있는 한 짜놓고 코드를 간단하게 해 나가는 작업을 많이 해봐야겠다.. 화이팅...
'실습' 카테고리의 다른 글
[Python] Open API 실습 - ③ NAVER Developers (0) | 2022.08.23 |
---|---|
[Python] Open API 실습 - ② 공공데이터포털 (0) | 2022.08.23 |
가상환경 구축과 git 사용법 실습 (0) | 2022.08.19 |
[Python] API 실습(request 라이브러리 사용) - ① (0) | 2022.08.18 |
Open API (0) | 2022.08.18 |