본문 바로가기
국비 교육/파이썬

[파이썬] 딕셔너리 Dictionary , 튜플 Tuple, 집합 Set

by 육츠 2023. 11. 5.
Contents 접기

Dictionary

파이썬에서 빠르게 데이터 베이스 같은 연산을 가능하게 한다. {} 혹은 dict() 를 이용해 생성한다.

key: value의 쌍으로 이루어졌다. key 를 통해 value를 얻는다.
key 값은 반드시 문자열일 필요는 없지만 변환 되는 값은 key로 사용 불가능하다. (unique 성격)
(문자열, 튜플, 숫자: key 가능 리스트: key 불가능)

사전 변수명 형식으로 찾는 경우 키가 없으면 예외가 발생된다. 
get() 함수는 키가 없을 때 예외를 발생하는 대신 None을 리턴한다.

score = {"홍길동":89, "임꺽정":88, "손오공":80, "전우치":67}

print("합계: ",sum(score.values()))    # 합계:  324
print("최고점: ",max(score.values()))  # 최고점:  89

print(sorted(score,reverse=True)) 
print(sorted(score.items(),reverse=True)) # 튜플 (k,v)
print(sorted(score.items(),reverse=True,key=lambda x:x[1]))

# ['홍길동', '전우치', '임꺽정', '손오공']
# [('홍길동', 89), ('전우치', 67), ('임꺽정', 88), ('손오공', 80)]
# [('홍길동', 89), ('임꺽정', 88), ('손오공', 80), ('전우치', 67)]

# print(sorted(score.items(),reverse=True,key=lambda x:x[0]))  이름기준 정렬
# key=lambda x:x[1] 익명함수(함수의 본체없이)
# 튜플이 x 에 , x[1] (1 번째: 성적 )를 기준으로 정렬하겠다.

print(score.items())
# dict_items([('홍길동', 89), ('임꺽정', 88), ('손오공', 80), ('전우치', 67)])
for k,v in score.items():
    print(f"이름:{k}, 점수:{v}")
        
# 이름:홍길동, 점수:89
# 이름:임꺽정, 점수:88
# 이름:손오공, 점수:80
# 이름:전우치, 점수:67

print(score['홍길동'])
# print(score['김철수']) # KeyError: '김철수' : 없는 키를 가지고 읽으려 할때
print(score.get('김철수')) # None
print(score.get('김철수',0)) # 대신 반환할 디폴트 값 


x = dict() # x= { } 비어있는 딕셔너리 선언
x['name'] = '전우치'
x['phone'] = '010-2222-2222'
x['phone'] = '010-2222-3333' #  키 값은 유니크 해야한다

print(x) # {'name': '전우치', 'phone': '010-2222-3333'}

 

[문제] 단어 빈도수 구하기
문장 안에 포함된 각 단어의 빈도수를 구하여 딕셔너리로 결과를 출력하세요
단어는 key가 되고 빈도수는 value가 된다.

song = '''Hello, it's me
I was wondering if after all these years you'd like to meet
To go over everything
They say that time's supposed to heal ya
But I ain't done much healing ....'''

word_list = song.replace('\n',' ').lower().split()

mydic = {} # 결과 저장

# 1)
# for word in word_list:
#     if mydic.get(word) == None: # if word not in mydic:
#         # value 값을 가져옴
#         mydic[word] = 1
#     else:
#         mydic[word] += 1 # mydic[word] = mydic[word] + 1

# 2)
# for word in word_list:
#     mydic[word] = mydic.get(word,0) +1 # def 값 0을 반환 +1
#     # 같은 단어이면 더해진 1이 반환되어 +1 진행

# 3)
for  word in word_list:
    mydic[word] = word_list.count(word) 
    # 같은 단어가 나오면 덮어 씌움
    
print(sorted(mydic.items(),key=lambda x:x[1], reverse= True)) # 내림차순
# 람다를 쓰지 않으면 key 값이 정렬 _>  default

# [('to', 14), ('you', 14), ('i', 12), ('that', 10), ("i'm", 8), ('it', 8), ...]

# 1은  if mydic.get(word) == None: 의 의미는 if word not in mydic: 으로 mydic 이라는 딕셔너리 안에 word로 넘어오는 단어가 없으면(None이면) 단어 , 1 을 저장, 있다면 +1 을 한다.
# 2는 mydic[word] = mydic.get(word,0) +1 이란 빈 딕셔너리에 word 와 (없으면 0)1을 더하여 넣는다. 
# 3은 mydic[word] = word_list.count(word) 같은 단어가 나오면 덮어 씌우게 된다. 

 

Tuple

리스트와 기본적으로 동일하며 () 으로 둘러싼 값이고, immutable 한 데이터이다.
리스트는 값의 생성, 삭제, 수정이 가능하지만 튜플은 값을 변경할 수 없다. 

 

Set 

{} , set , set() 을 통해 생성한다. (파이썬 2,3 부터 지원된 자료형이다.)
중복을 허용하지 않고 순서가 없다. 자료형의 중복을 제거하기 위해 사용한다.
순서가 없기 때문에 인덱싱 하여 값을 얻을 수 없으며 리스트나 튜플로 변경한 후 값을 추출한다. 

print(set("Hello Python")) # 중복 제거
# {'P', 'l', 'o', 'e', 'H', 'h', 't', 'n', 'y', ' '}

a = {1,2,3,4,5,6}
b ={5,6,7,8}

print("합집합:" ,a.union(b))        # 합집합: {1, 2, 3, 4, 5, 6, 7, 8}
print("교집합:" ,a.intersection(b)) # 교집합: {5, 6}
print("차집합:", a.difference(b))   # 차집합: {1, 2, 3, 4}
print("배타적 차집합:" , a.symmetric_difference(b)) # 배타적 차집합: {1, 2, 3, 4, 7, 8}

 

'국비 교육 > 파이썬' 카테고리의 다른 글

[파이썬] 함수 -1  (0) 2023.11.05
[파이썬] Comprehension, zip(), enumerate()  (0) 2023.11.05
[파이썬] List  (0) 2023.11.04
[파이썬] 문자열 다루기  (0) 2023.11.04