728x90


딕셔너리(dictionary)

1. 딕셔너리 객체를 만든는 4가지 방법
2. 뷰객체와 for 문
3. 딕 컴프리헨션(dict comprehension)
4. Zip함수
5. 딕셔너리 수정
6. setdefault
7. defaultdict
8. OrderedDict


1. 딕셔너리 객체를 만든는 4가지 방법

# 딕셔너리를 만드는 4가지 방법

d1 = {'a': 1, 'b': 2, 'c': '3'}
d2 = dict([('a', 1), ('b', 2), ('c', 3)])
d3 = dict(a=3, b=2, c=3)
d4 = dict(zip['a', 'b', 'c'], [1, 2, 3])

 


2. 뷰객체와 for 문

딕셔너리 내부의 메소드를 통해 뷰객체를 얻을 수 있는데, 뷰 객체는 iterator 객체로 for문에 사용 가능하다. 또 이렇게 얻은 뷰 객체는 key와 value에 접근하는데 사용할 수 있고 딕셔너리가 수정되면 수정 사항을 그대로 반영한다는 특징이 있다.

뷰 객체를 얻는 방법
dict_obj.keys() 딕셔너리의 key들만 참조
dict_obj.values() 딕셔너리의 value들만 참조
dict_obj.items() 딕셔너리의 key와 value를 튜플 형태로 참조
# 뷰객체를 사용한 딕셔너리 for문

dict_fruit = dict(zip(['사과', '바나나', '복숭아'], ['apple', 'banana', 'peach']))
for x in dict_fruit.items():  # in dict_fruit 구문을 사용하면 key를 x로 전달
    print(x)
#  ('사과', 'apple')
#  ('바나나', 'banana')
#  ('복숭아', 'peach')

 


3. 딕 컴프리헨션(dict comprehension)


리스트 컴프리헨션처럼 딕셔너리도 컴프리헨션 구문을 사용해 간결하게 딕셔너리내 인자를 수정할 수 있다. 아래 코드는 for 문에서 할 수 있는 수정을 딕 컴프리헨션으로 바꾼 결과다.

dic_comp = {k: v for k, v in dict.itmes()}

# for 문을 사용해 딕셔너리 수정
dict_fruit = dict(zip(['사과', '바나나', '복숭아'], ['apple', 'banana', 'peach']))

for x in dict_fruit.keys():
    dict_fruit[x] = 'korean_' + dict_fruit[x]
    
print(dict_fruit)  # {'사과': 'korean_apple', '바나나': 'korean_banana', '복숭아': 'korean_peach'}

# 딕 컴프리헨션을 사용해 딕셔너리 수정
dict_fruit2 = dict(zip(['사과', '바나나', '복숭아'], ['apple', 'banana', 'peach']))

dic_comp = {k: 'korean_'+v for k, v in dict_fruit2.items()}

print(dic_comp)  # {'사과': 'korean_apple', '바나나': 'korean_banana', '복숭아': 'korean_peach'}

 


4. Zip함수

데이터를 구분하고 나눌 때 사용하는 함수로, 인자로 전달된 리스트, 튜플, 문자열을 조합해 다수의 튜플을 만든다. zip 함수에 의해 반환된 튜플들로는 다시 리스트, 튜플 딕셔너리를 만들 수 있다. 또, zip 함수가 반환하는 객체는 iterable 객체로 for 문에 사용할 수 있다. 

# zip에 리스트를 인자로 전달해 튜플들을 만들고 최종적으로 리스트로 묶어서 반환
lz = list(zip(['a', 'b', 'c'], [1, 2, 3]))
print(lz)  # [('a', 1), ('b', 2), ('c', 3)]

# zip에 튜플을 인자로 전달해 튜플들을 만들고 최종적으로 튜플로 묶어서 반환
tz = tuple(zip(('a', 'b', 'c'), (1, 2, 3), ('A', 'B', 'C')))
print(tz)  # (('a', 1, 'A'), ('b', 2, 'B'), ('c', 3, 'C'))

# zip에 문자열과 튜플을 전달해 딕셔너리를 만듬
dz = dict(zip('abc', (1, 2, 3)))
print(dz)  # {'a': 1, 'b': 2, 'c': 3}

 


5. 딕셔너리 수정

 

dict_fruit = dict(zip(['사과', '바나나', '복숭아'], ['apple', 'banana', 'peach']))

# 기존에 있던 value 를 수정할 때, 만약 key 가 존재 하지 않는 다면 오류 발생
dict_fruit['사과'] = 'APPLE'
print(dict_fruit)  # {'사과': 'APPLE', '바나나': 'banana', '복숭아': 'peach'}

# 기존 딕셔너리에 새로운 인자 추가
dict_fruit['수박'] = 'water melon'
print(dict_fruit)  # {'사과': 'APPLE', '바나나': 'banana', '복숭아': 'peach', '수박': 'water melon'}

 


6. setdefault


딕셔너리의 setdefault 메소드를 for 문과 같이 사용하면, 딕셔너리를 수정할 때 if-else 를 사용하는 것과 같은 코드를 간단하게 만들 수 있다.

dict.setdefault(k, v)

# setdefault 메소드에 매개변수로 k와 v를 전달
# k에 해당하는 key 가 있을 때, 그 key 의 값을 반환
# k에 해당하는 key 가 없을 때, 딕셔너리에 k:v 를 저장하고 v 를 반환

# 문자열의 알파벳 개수를 저장하는 딕셔너리

str1 = "appleeeee"

# 1 for-else를 사용
str_counter1 = {}
for x in str1:
    if x in str_counter1:
        str_counter1[x] += 1
    else:
        str_counter1[x] = 1
print(str_counter1)  # {'a': 1, 'p': 2, 'l': 1, 'e': 5}

# 2 setdefault 사용
str_counter2 = {}
for x in str1:
    str_counter2[x] = str_counter2.setdefault(x, 0) + 1
print(str_counter2)  # {'a': 1, 'p': 2, 'l': 1, 'e': 5}

 


7. defaultdict

 

디폴트 값을 갖는 딕셔너리를 만들 때 사용하는 메소드로, collections 모듈의 defaultdict 을 import 해야 함
* from collections import defaultdict
찾는 키가 없으면 예외를 발생시키지 않고 해당 키를 추가하되, 미리 등록해 놓은 함수가 반환하는 디폴트 값을 그 키의 값으로 저장

from collections import defaultdict


def default_setting():
    return 0


str1 = "appleeeee"
dd = defaultdict(default_setting)  # 함수 뒤에 ()가 없어야 함

for k in str1:
    dd[k] += 1  # default_setting 함수에 의해 해당 키가 없으면 1 으로 세팅
                 # 해당 키가 있다면, key 의 value 에 +1
print(dd)  # defaultdict(<function default_setting at 0x000001F2E53061F0>, {'a': 1, 'p': 2, 'l': 1, 'e': 5})


# 함수를 만들지 않고 람다로 처리
ddd = defaultdict(lambda: 0)
for k in str1:
    ddd[k] += 1
print(ddd)  # defaultdict(<function <lambda> at 0x00000239D8CAA550>, {'a': 1, 'p': 2, 'l': 1, 'e': 5})

 


8. OrderedDict


 딕셔너리 객체를 비교할 때 저장 순서도 중요한 경우 OrderedDict 을 사용한다. collections 모듈의 OrderedDict 을 import 해야 함. * from collections import OrderedDict
딕셔너리 객체에 담긴 내용이 같아도 저장 순서가 다르다면 False 를 반환. 저장 순서까지 같다면 True를 반환한다.

* od.move_to_end('key1')  # key1을 키로 갖는 인자를 딕셔너리의 맨 끝으로 보낸다.
* od.move_to_end('key1', last = False)  # key1을 키로 갖는 인자를 맨 앞으로 보낸다.

from collections import OrderedDict

od1 = OrderedDict(zip(['a', 'b', 'c'], [1, 2, 3]))
od2 = OrderedDict(a=1, b=2, c=3)

print(od1 == od2)  # True
print(od1 is od2)  # False

od1.move_to_end('a')  # OrderedDict([('b', 2), ('c', 3), ('a', 1)])
print(od1 == od2)  # False

od1.move_to_end('a', last=False)  # OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od1)
print(od1 == od2)  # True

 




728x90

+ Recent posts