<jupyter_start><jupyter_text>II. 파이썬 프로그래밍의 기초, 자료형---  __5. 딕셔너리(Dictionary)__* 사람은 누구든지 '이름' = '홍길동', '생일' = '몇 월 몇 일' 등으로 구분할 수 있다* 이러한 대응 관계를 연관 배열(Associative array), 해시(Hash)라고 한다* 파이썬에서는 이러한 자료형을 딕셔너리(Dictionary)라고 한다* 딕셔너리는 Key와 Value라는 것을 한 쌍으로 갖는 자료형이다* 딕셔너리는 리스트나 튜플처럼 순차적으로(sequenitial) 해당 요소값을 구하지 않고 Key를 통해 Value를 얻는다  __1) 딕셔너리(Dictionary)는 어떻게 만들까?__* 다음은 기본적인 딕셔너리의 모습이다__{Key1:Value1, Key2:Value2, Key3:value3 …}__* __{}__으로 둘러싸여 있다* __Key:Value__ 형태로 이루어져 있고 __쉼표(,)__로 구분되어 있다* __Key__에는 __변하지 않는 값__을 사용하고, __Value__에는 변하는 값과 변하지 않는 값 __모두 사용__할 수 있다<jupyter_code>dic = {'name':'pey', 'phone':'0119993323', 'birth':'1118'}
dic<jupyter_output><empty_output><jupyter_text>| __Key__ | __Value__|| :---: | :---: || name | pey || phone | 0119993323 || birth | 1118 |<jupyter_code>a = {1 : 'hi'} 
a = {'a' : [1, 2, 3]} # Value값에 리스트도 넣을 수 있다<jupyter_output><empty_output><jupyter_text>__2) 딕셔너리(Dictionary) 쌍 추가ㆍ삭제__  __가. 쌍 추가__* a[2] = 'b'와 같이 입력하면 딕셔너리 a에 Key와 Value가 각각 2와 'b'인 2 : 'b'라는 딕셔너리 쌍이 추가된다<jupyter_code>a = {1 : 'a'} 
print(a)
a[2] = 'b'
a
a['name'] = 'pey'
a
a[3] = [1, 2, 3]
a<jupyter_output><empty_output><jupyter_text>__나. 요소 삭제__<jupyter_code>del a[1]
a<jupyter_output><empty_output><jupyter_text>__2) 딕셔너리(Dictionary) 사용하는 방법__* 예를 들어 4명의 사람이 있다고 가정하고, 각자의 특기를 표현한다면 리스트나 문자열로는 표현하기가 상당히 까다로울 것이다* 파이썬의 딕셔너리를 사용하면 표현하기가 정말 쉽다<jupyter_code>a = {'김연아':'피겨', '류현진':'야구', '박지성':'축구', '귀도':'파이썬'}
a<jupyter_output><empty_output><jupyter_text>__가. 딕셔너리에서 Key 사용해 Value 얻기__* 리스트나 튜플, 문자열은 요소값을 얻어내고자 할 때 인덱싱이나 슬라이싱 기법 중 하나를 이용했다* 하지만 딕셔너리는 단 한가지 방법 뿐이며, 이는 Key를 사용해서 Value를 얻어내는 방법이다* key의 Value를 얻기 위해서는 *'딕셔너리 변수[Key]'*를 사용한다<jupyter_code>grade = {'pey':10, 'julliet':99}
print(grade['pey'])
print(grade['julliet'])<jupyter_output>10
99<jupyter_text>* 즉 딕셔너리 grade는 grade[Key]로 입력해서 Key에 해당하는 Value를 얻는다  __나. 딕셔너리 만들 때 주의할 사항__* 딕셔너리에서 Key는 고유한 값이므로 중복되는 Key 값을 설정해 놓으면 하나를 제외한 나머지 것들이 모두 무시된다는 점을 주의해야 한다<jupyter_code>a = {1:'a', 1:'b'}
a<jupyter_output><empty_output><jupyter_text>(1) 위의 예시에서 볼수 있듯이, 동일한 Key가 2개 존재할 경우 1:'a'라는 쌍이 무시된다  * 이때 어떤 것이 무시될지는 예측할 수 없다  * Key가 중복되었을때 무시되는 이유는 Key를 통해서 Value를 얻는 딕셔너리의 특징에서 비롯된다  * 즉, 동일한 Key가 존재하면 어떤 Key에 해당하는 Value를 불러야 할지 알 수 없기 때문이다  * 결론은 중복되는 Key를 사용하지 말아야 한다는 것이다<jupyter_code>a = {[1, 2]: 'hi'}<jupyter_output><empty_output><jupyter_text>(2) Key에 리스트는 쓸수 없다  * 하지만 튜플은 Key로 쓸수 있다  * 딕셔너리의 Key로 튜플 사용의 여부는 Key가 변하는지에 대한 여부에 달려있다  * 리스트는 그 값이 변할 수 있기 때문에 Key로 쓸수 없는 것이다  * 위 예처럼 리스트를 Key로 설정하면 리스트를 키 값으로 사용할 수 없다는 TypeError가 발생한다  __2) 딕셔너리(Dictionary) 관련 함수__  __가. Key 리스트 만들기 - keys__* dic.keys()는 딕셔너리 dic의 Key만을 모아서 dict_keys라는 객체를 리턴한다<jupyter_code>dic = {'name':'pey', 'phone':'0119993323', 'birth':'1118'}
dic.keys()<jupyter_output><empty_output><jupyter_text>* dict_keys 객체는 다음과 같이 사용할 수 있다* 리스트를 사용하는 것과 차이가 없지만, 리스트 고유의 함수인 append, insert, pop, remove, sort 등의 함수를 수행할 수는 없다<jupyter_code>for k in dic.keys() :
    print(k)<jupyter_output>name
phone
birth<jupyter_text>* dict_keys 객체를 리스트로 변환하려면 다음과 같이 하면 된다<jupyter_code>list(dic.keys())<jupyter_output><empty_output><jupyter_text>__나. Value 리스트 만들기 - values__* Key를 얻는 것과 마찬가지로 Value만 얻고 싶다면 values 함수를 사용하면 된다* values 함수를 호출하면 dict_values 객체가 리턴된다 * dict_values 객체 역시 dict_keys 객체와 마찬가지로 리스트를 사용하는 것과 동일하게 사용하면 된다<jupyter_code>dic.values()<jupyter_output><empty_output><jupyter_text>__다. Key, Value 쌍 얻기 - items__* items 함수는 key와 value의 쌍을 튜플로 묶는 값을 dict_items 객체로 돌려준다<jupyter_code>dic.items()<jupyter_output><empty_output><jupyter_text>__라. Key:Value 쌍 모두 지우기 - clear__* clear()함수는 딕셔너리 안의 모든 요소를 삭제한다* 빈 딕셔너리는 {}로 표현한다<jupyter_code>dic.clear()
dic<jupyter_output><empty_output><jupyter_text>__마. Key로 Value 얻기 - get__* get(x) 함수는 x라는 Key에 대응되는 Value를 돌려준다* 존재하지 않는 키로 값을 가져오려고 하면 None을 돌려준다<jupyter_code>a = {'name':'pey', 'phone':'0119993323', 'birth':'1118'}
print(a.get('name')) # print(a['name'])와 출력은 같다
print(a.get('dd'))<jupyter_output>pey
None<jupyter_text>* a['name']는 출력 값은 같으나 존재하지 않는 키로 값을 가져오려하면 Key오류를 발생시킨다<jupyter_code>a['dd']<jupyter_output><empty_output><jupyter_text>* 딕셔너리 안에 찾으려는 Key 값이 없을 경우 미리 정해둔 디폴트 값을 대신 가져오게 하고 싶을때는 get(x, '디폴트 값')을 사용하면 편리하다<jupyter_code>a.get('foo', 'bar')<jupyter_output><empty_output><jupyter_text>__바. 해당 Key가 딕셔너리 안에 잇는지 조사 - in__<jupyter_code>print('name' in a)
print('email' in a)<jupyter_output>True
False
{'fraction_non_alphanumeric': 0.13126159554730985, 'fraction_numerical': 0.022727272727272728, 'mean_word_length': 5.524962178517398, 'pattern_counts': {'":': 0, '<': 69, '<?xml version=': 0, '>': 69, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '18', 'dir': 'jupyter-structured-clean-dedup', 'id': '109563', 'license': 'MIT', 'n_tokens_mistral': 3111, 'n_tokens_neox': 3633, 'n_words': 556, 'path': 'II_05.ipynb', 'repo_name': 'Phhoooh/Python', 'size': '4312'}