Programming/Python

[Python 3.7] 파이썬 딕셔너리 사용법

Nirsa 2020. 2. 3. 15:03
반응형

 

[Python] 파이썬 딕셔너리란? : https://nirsa.tistory.com/43?category=861479

 

  • 1. 딕셔너리 키-값 쌍 추가

  • setdefault : 키-값 쌍 추가
  • update : 키 값 수정, 만약 키가 없다면 키-값 쌍 추가

setdefault는 딕셔너리의 키-값 쌍을 추가 합니다. 만약 키만 지정하고 값을 지정하지 않는다면 None를 저장 하게 됩니다. 만약 키-값을 추가할 경우 값을 저장하면서 입력했던 값을 반환 합니다.

# 테스트를 위한 딕셔너리 생성
x = {'a': 1, 'b': 2, 'c':3}

# 키만 지정
x.setdefault('d')
print(x)
결과값 : {'a': 1, 'b': 2, 'c': 3, 'd': None}

# 키-값 지정
x.setdefault('e', 5)
결과값 : 5
print(x)
결과값 : {'a': 1, 'b': 2, 'c': 3, 'd': None, 'e': 5}

 

update는 키 값을 수정하고 만약 지정한 키가 없다면 키-값 쌍을 추가 합니다.

# 테스트를 위한 딕셔너리 생성
x = {'a': 1, 'b': 2, 'c':3}

# b를 20으로 변경
x.update(b=20)
print(x)
결과값 : {'a': 1, 'b': 20, 'c': 3}

# 없는 키(d)를 지정하여 키-값 생성
x.update(d=50)
print(x)
결과값 : {'a': 1, 'b': 20, 'c': 3, 'd': 50}

또한 update는 키가 문자열일때만 사용 할 수 있는데, 키가 숫자일 경우 {}으로 한번 더 묶어줘서 딕셔너리 형태로 사용해주어야 합니다.

# 테스트를 위한 딕셔너리 생성
x = {1: 'a', 2: 'b', 3: 'c'}

x.update({1: 'aa', 3:'cc'})
print(x)
결과값 : {1: 'aa', 2: 'b', 3: 'cc'}

 

  • 2. 딕셔너리 키-값 쌍 제거

  • pop : 특정 키-값 삭제 후 삭제된 값 반환
  • popitem : 마지막 키-값 쌍 삭제 후 튜플로 반환
  • clear : 모든 키-값 삭제

pop은 특정 키-값을 삭제 하고 삭제된 값을 반환 합니다. 만약 키 뒤에 숫자를 입력 하면 해당 키가 없을 경우 입력했던 숫자를 반환 합니다.  

 

x = {'a': 1, 'b': 2, 'c':3}

# pop(키)
x.pop('a')
결과값 : 1

print(x)
결과값 : {'b': 2, 'c': 3}

# 키가 없을 경우 설정한 -1 반환
x = {'b': 2, 'c':3}
x.pop('a', -1)
결과값 : -1

 

popitem은 마지막 키-값 쌍 삭제 후 튜플로 반환 합니다. (Python 3.5 이하 버전에서는 마지막이 아닌 임의의 키-값을 삭제 합니다.)

x = {'a': 1, 'b': 2, 'c':3}

x.popitem()
결과값 : ('c', 3)

print(x)
결과값 : {'a': 1, 'b': 2}

 

clear는 모든 키-값을 삭제 합니다.

x = {'a': 1, 'b': 2, 'c':3}

x.clear()
print(x)

결과값 : {}

 

  • 3. 딕셔너리 키-값 가져오기

  • items : 키-값 쌍을 모두 가져옴
  • keys : 키를 모두 가져옴
  • values : 값을 모두 가져옴

위의 키-값을 가져오는 메서드 들은 키던 값이던 모두 가져오게 됩니다. 일반적으로 for문과 같이 사용하여 키나 값만을 가져오거나 if 조건문을 통해 특정 값이나 키일 경우 가져오거나 삭제 등을 할 수 있습니다.

items는 키-값 쌍을 모두 가져 옵니다.

x = {'a': 1, 'b': 2, 'c':3}

x.items()
결과값 : dict_items([('a', 1), ('b', 2), ('c', 3)])


## for문을 이용해 키-값 가져오기
x = {'a': 1, 'b': 2, 'c':3}

for key, value in x.items():
	print(key, value)
    
# 결과값
a 1
b 2
c 3

 

key는 키를 모두 가져 옵니다.

x = {'a': 1, 'b': 2, 'c':3}
x.keys()
결과값 : dict_keys(['a', 'b', 'c'])


## for문을 이용해 키 가져오기
x = {'a': 1, 'b': 2, 'c':3}

for key in x.keys():
	print(key)
    
# 결과값
a
b
c

 

values는 값을 모두 가져 옵니다.

x = {'a': 1, 'b': 2, 'c':3}
x.values()
결과값 : dict_values([1, 2, 3])


## for문을 이용해 값 가져오기
for value in x.values():
	print(value)
    
# 결과값
1
2
3

 

  • 4. 딕셔너리 복사

딕셔너리 복사는 copy를 사용 합니다. 변수 형식으로 어떤 딕셔너리에 다시 딕셔너리를 선언할 경우 그 둘은 같은 객체가 되어 값 삭제, 추가, 수정 등에 모두 영향을 받게 됩니다. 아래 코드를 확인하여 z=x식으로 딕셔너리를 할당할 경우 같은 객체가 되는것을 확인해 주세요.

x = {'a': 1, 'b': 2, 'c':3}

# x 딕셔너리를 z 딕셔너리로 할당
z = x

# z와 x는 같은 객체임을 확인
z is x
결과값 : True
 
# 딕셔너리 x의 a키 값을 5로 수정
x.update(a=5)

# 딕셔너리 x와 z 모두 변경된 내용 확인
print(x)
{'a': 5, 'b': 2, 'c': 3}
print(z)
{'a': 5, 'b': 2, 'c': 3}

 

이러한 이유로 리스트, 딕셔너리 등을 복사할 때는 copy를 사용 합니다.

x = {'a': 1, 'b': 2, 'c':3}

# x 딕셔너리를 z 딕셔너리로 할당
z = x.copy()

# z와 x는 다른 객체임을 확인
z is x
결과값 : False
 
# 딕셔너리 x의 a키 값을 5로 수정
x.update(a=5)

# 딕셔너리 x에만 변경된 내용 확인
print(x)
{'a': 5, 'b': 2, 'c': 3}
print(z)
{'a': 1, 'b': 2, 'c': 3}

 

만약 중첩 딕셔너리를 복사 하려면 copy 모듈의 deepcopy 함수를 사용 해야 합니다.

# 중첩 딕셔너리 생성
x = {'a': {'python': 3.7}, 'b': {'python': 3.8}}

# copy 모듈을 불러온 후 deepcopy 사용
import copy
y = copy.deepcopy(x)

# 딕셔너리 y안의 딕셔너리 a의 키 python 값을 2.7.1로 변경
y['a']['python'] = '2.7.1'

# 각 딕셔너리의 변동 사항이 다른것을 확인
print(x)
결과 값 : {'a': {'python': 3.7}, 'b': {'python': 3.8}}
print(y)
결과 값 : {'a': {'python': '2.7.1'}, 'b': {'python': 3.8}}

중첩 딕셔너리는 아주 간단하게 그림으로 표현하면 아래와 같이 됩니다. 딕셔너리 안에 또다른 딕셔너리가 있는 개념 입니다.

 

반응형