본문 바로가기

코딩/Python

[Python/파이썬] 자료형 - Dictionary 1편 : 기초

반응형

2021.06.13 - [코딩/Python] - [Python/파이썬] 자료형 - Dictionary 1편 : 기초

2021.06.19 - [코딩/Python] - [Python/파이썬] 자료형 - Dictionary 2편 : 딕셔너리 컴프리헨션

 

  자료형 중 딕셔너리에 대한 이해가 부족하여 작성하는 포스팅. 새로운 프로그램을 만들 때 딕셔너리를 활용해야 할 필요가 있어 기초 및 대표 함수에 대한 내용을 정리한다.  

 

 

1. 딕셔너리(Dictionary)

 

  -. 딕셔너리는 Key와 Value를 갖는 파이썬의 자료형이다.

  -. Key와 Value는 한쌍으로 입력 된다.

  -. 리스트는 대괄호 [ ] , 딕셔너리는 중괄호{ }로 구성한다는 것을 기억하자.

  -. 아래 코드는 딕셔너리의 기본적인 구성과 각 key에 따른 Value를 조회하는 방법을 코드로 작성해보았다.

 

<코드>

#딕셔너리 3개요소 구성(Key : Value)
p = {'key' : 'value', 1 : 'b', '테스트':'test'}

#전체 딕셔너리 요소 출력
print(p)

#각 Key에 따른 Value 출력해보기
print(p[1])
print(p['key'])
print(p['테스트'])

 

<결과>

{'key': 'value', 1: 'b', '테스트': 'test'}
b
value
test

 

-. 중괄호 { } 안에 Key : Value 형태로 입력된다. Value를 조회하고 싶다면 딕셔너리명[Key]를 사용한다. 

-. 리스트와 같이 인덱스(0,1,2,3...)을 통한 조회는 불가능하다. 위 p[1]의 1은 딕셔너리의 Key를 가리키는 것이므로 혼동하지 말자. 아래를 보면 에러가 발생함을 확인할 수 있다.

 

<코드>

p = {'key' : 'value', 1 : 'b', '테스트':'test'}

#인덱스로 조회하면?
print(p[0])

 

<결과>

Traceback (most recent call last):
  File "c:\Users\Desktop\VS Code Project\Python\Practice\p1.py", line 5, in <module>
    print(p[0])
KeyError: 0

 

 

2. 다양한 딕셔너리 형태

 

1) 딕셔너리의 형태인 Key : Value 형태에서 Value에는 튜플, 리스트 등 다른 자료형이 들어갈 수 있다.

 

 

<코드>

#과일의 Value는 리스트, 숫자의 Value는 튜플
p = {'과일' : ['사과','귤'] , "숫자" : (1,2,3)}

print(p['과일'])
print(p['숫자'])

 

<결과>

['사과', '귤']
(1, 2, '삼')

 

  만약 위와 같이 Value가 리스트, 튜플같은 자료형으로 입력되었는데 Value의 각 요소를 조회하고 싶다면 아래와 같이 인덱스를 덧붙여주면 된다.(리스트, 튜플 인덱스 조회방법과 동일 함)

 

※ 사용법

딕셔너리명[Key][Index]

 

 

<코드>

p = {'과일' : ['사과','귤'] , "숫자" : (1,2,3)}

print(p['과일'][0])
print(p['과일'][1])
print(p["숫자"][2])

 

<결과>

사과
귤
3

 

 

2) 딕셔너리의 형태인 Key : Value 형태에서 Key는 중복될 수 없다.

 

 

  Key가 중복될 경우 가장 마지막 요소만 조회된다. 첫 요소는 무시되기 때문에 Key는 중복되지 않게 딕셔너리를 생성해야 한다.

 

 

<코드>

p = {'과일' : ['사과','귤'] , "과일" : "수박"}

print(p)

 

<결과>

{'과일': '수박'}

 

  만약 Key가 중복되게 생성해야할 경우는 아래와 같이 클래스 객체를 입력하는 방법으로 생성해야 한다. 이 부분은 다른 티스토리에서 잘 정리해주셔서 참고해서 코드를 작성했다.

(참고링크 : https://kangprog.tistory.com/27)

 

<코드>

#중복된 딕셔너리 생성을 위한 클래스 정의
class fruit(object):
    def __init__(self, name):
        self.name = name
    
    def __str__(self):
        return self.name

    def __repr__(self):
        return "'"+self.name+"'"

#dictionry 생성을 위한 빈 딕셔너리 생성
fruit_dict = {}

#중복된 Key값 3개 넣어보기
fruit_dict[fruit("과일")] = "수박"
fruit_dict[fruit("과일")] = "사과"
fruit_dict[fruit("과일")] = "바나나"

print(fruit_dict)

 

<결과>

{'과일': '수박', '과일': '사과', '과일': '바나나'}

 

  위 형태는 딕셔너리의 Key값을 클래스의 객체 타입으로 넣는 형식이다. 따라서, 원래 딕셔너리에서 Key값을 통한 조회는 에러가 발생한다.

 

<코드>

print(fruit_dict["과일"])

 

<결과>

Traceback (most recent call last):
  File "c:\Users\Desktop\VS Code Project\Python\Practice\p1.py", line 20, in <module>
    print(fruit_dict["과일"])
KeyError: '과일'

 

 

3) Key값에는 리스트가 들어갈 수 없다. 대신 튜플은 가능하다.

 

  딕셔너리의 Key값은 수정이 되냐, 안되냐에 따라 입력 가능 여부가 결정된다. 따라서 수정이 되는 리스트는 입력될 수 없다. 대신 튜플은 입력가능하다. 아래 2가지 예시를 보자.

 

 

Case1) Key값에 리스트 넣어보기

 

 

<코드>

p = {["과일","채소"] : ["사과", "당근"]}

 

<결과>

TypeError: unhashable type: 'list'

 

  Key값에 리스트를 넣을 경우 타입에러가 발생하낟.

 

 

Case2) Key값에 튜플 넣어보기

 

 

<코드>

p = {("과일","채소") : ["사과", "당근"]}

print(p)


<결과>

{('과일', '채소'): ['사과', '당근']}

 

 

3. 딕셔너리에서 자주 쓰이는 함수들

 

  점프투파이썬 교재를 보며 딕셔너리 자료형 사용시 자주 사용하는 함수들에 대해 정리해보았다. 잘쓸 것 같은 대표적인 3가지만 정리해보았고 더 필요한 내용은 점프투파이썬을 참고!

 

 

1)  Key, Value로 리스트 만들기

 

 

<코드>

p = {"과일": "사과", "채소" : "당근", "육류" : "돼지고기"}

#Key를 리스트로 출력
print(p.keys())

#Value를 리스트로 출력
print(p.values())

 

<결과>

dict_keys(['과일', '채소', '육류'])
dict_values(['사과', '당근', '돼지고기'])

 

 

  위 형태는 for 문을 통해 Key 또는 Value 개별 요소에 접근할 수 있다. 아래처럼 for문을 통해 각 요소를 출력할 수 있다.

 

<코드>

p = {"과일": "사과", "채소" : "당근", "육류" : "돼지고기"}

for a in p.keys():
    print(a)

 

<결과>

과일
채소
육류

 


2) Key, Value 쌍으로 리스트화 하기

 

 

  Key, Value를 쌍으로 리스트화하고 싶다면 items( ) 함수를 사용한다. 아래 결과에서 보면 알겠지만 리스트이 각 요소는 튜플이다. 

 

 

<코드>

p = {"과일": "사과", "채소" : "당근", "육류" : "돼지고기"}

for a in p.items():
    print(a)

 

<결과>

('과일', '사과')
('채소', '당근')
('육류', '돼지고기')

 


3) Key로 Value 얻기

 

 

  위에서 정리했던 내용 중 Key를 통해 Value를 조회하려면 딕셔너리명[Key]를 사용하면 된다고 언급했다. get( )이라는 함수를 사용하면 동일한 결과를 출력한다.

 

  2개의 차이점은 get( ) 함수를 사용할 경우 조회되는 Key값이 없으면 None을 반환한다. 딕셔너리명[key] 형태의 경우 Key값이 없으면 에러가 발생한다.

 

 

<코드>

p = {"과일": "사과", "채소" : "당근", "육류" : "돼지고기"}

print(p.get("과일"))
print(p.get("기타"))

 

<결과>

사과
None

 

 

  리스트에 리스트 컴프리헨션이 있는 것처럼 딕셔너리에도 컴프리헨션 구문이 존재한다. 컴프리헨션 내용과 딕셔너리를 어디에 응용할지는 다음 편에 정리할 예정.

 


참고링크1 : https://wikidocs.net/16#_7 점프투파이썬 - 딕셔너리

참고링크2 : https://kangprog.tistory.com/27 - 딕셔너리 키 중복으로 입력하기

728x90