build my life

[Python] 클래스 만들기 - 실습(3) 본문

실습

[Python] 클래스 만들기 - 실습(3)

dalovee 2022. 8. 9. 17:28
728x90

문제 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 출력 완료!

 


문제를 보면 어떤 메소드를 이용해서 문제를 해결해야지 생각이 들지만 적용을 잘 못한다는 걸 알게 되었다.

지금까지 배운 메소드들을 한번 더 복습하면서 어떻게 활용할 수 있는지를 계속해서 문제 풀이를 통해 고민해봐야겠다!

 

또한 처음부터 간단하게 쓰려고 하는 것보다 아직 코딩 실력이 주니어 주니어 하니 내가 할 수 있는 한 짜놓고 코드를 간단하게 해 나가는 작업을 많이 해봐야겠다.. 화이팅...

 

728x90