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 |