딕셔너리와 리스트는 비슷하다. 다른 점은 항목의 순서를 따지지 않으며, 0 또는 1과 같은 오프셋으로 항목을 선택할 수 없다. 대신 값에 상응하는 고유한 키를 지정한다. 키는 대부분 문자열이지만 불변하는 타입(불리언, 정수, 부동소수점, 튜플, 문자열)이 될 수 있다.
「딕셔너리」
「{ }」:생성
> 딕셔너리를 만들려면 중괄호({ })안에 콤마로 구분한 키값을 지정한다.
car={}
car
->{}
car={
"brand": "hyundai",
"model": "santafe",
"code": "HCD-4"
}
car
->{'brand': 'hyundai', 'model': 'santafe', 'code': 'HCD-4'}
> 리스트, 튜플, 딕셔너리의 마지막 항목에는 콤마를 입력하지 않아도 된다. 파이썬에서 들여 쓰기는 중요하지만, 키와 값을 입력할 때 중괄호 내에 반드시 들여 쓰기를 할 필요는 없다. 중괄호는 단지 가독성을 좋게 만들 뿐이다.
「dict( )」:생성, 변환
「생성」
car=dict(brand="hyundai",model="avante",code="DN7")
car
->{'brand': 'hyundai', 'model': 'avante', 'code': 'DN7'}
> 이때 제약 사항은 인수 이름이 유용한 변수 이름이여야 한다.
「변환」
alpa=[['a','b'],['c','d'],['e','f']]
dict(alpa)
->{'a': 'b', 'c': 'd', 'e': 'f'}
beta=[('a','b'),('c','d'),('e','f')]
dict(beta)
->{'a': 'b', 'c': 'd', 'e': 'f'}
gamma=(['a','b'],['c','d'],['e','f'])
dict(gamma)
->{'a': 'b', 'c': 'd', 'e': 'f'}
delta=['ab','cd','ef']
dict(delta)
->{'a': 'b', 'c': 'd', 'e': 'f'}
zeta=('ab','cd','ef')
dict(zeta)
->{'a': 'b', 'c': 'd', 'e': 'f'}
「key」: 항목추가/ 변경
hyundai={
"avante":"DN7",
"sonata": "DN8",
"santafe": "HCD-4",
"tucsan":"NX4",
"kona":"sx2"
}
hyundai
->{'avante': 'DN7', 'sonata': 'DN8', 'santafe': 'HCD-4', 'tucsan': 'NX4', 'kona': 'sx2'}
#차량이 누락됐을때 추가
hyundai['grandeur']='GN7'
hyundai
->{'avante': 'DN7', 'sonata': 'DN8', 'santafe': 'HCD-4',
'tucsan': 'NX4', 'kona': 'sx2', 'grandeur': 'GN7'}
- 딕셔너리에 항목을 추가하는 것은 키에 참조되는 항목에 값을 할당하면 된다.
- 딕셔너리에 이미 존재하는 키라면 그 값은 새 값으로 대체되고, 키가 존재하지 않는다면 새 값과 키가 사전에 추가된다.
- 리스트와 달리 딕셔너리를 할당할 때는 인덱스 범위가 벗어나는 예외에 대해서 걱정할 필요가 없다
- 딕셔너리의 키들은 반드시 고유해야 한다.
「key,get( )」: 항목 얻기
> 딕셔너리의 가장 일반적인 용도. 딕셔너리에 키를 지정하여 상응하는 값을 얻는다.
stock={
"삼성전자":"005930",
"lg에너지솔루션":"373220",
"sk하이닉스":"000660",
"현대차":"005380",
"NAVER":"035420",
"카카오":"035720"
}
stock['삼성전자']
->'005930'
> 딕셔너리에 키가 없으면 문제가 발생하는데, 이는 아래와 같이 해결한다.
'삼성전자' in stock
->True
stock.get('NAVER')
->'035420'
stock.get('기아차','not found')
->'not found'
stock.get('기아차')
->
- in으로 키에 대한 멤버십을 테스트하기
- get() 함수를 사용하여 테스트하기
- 만약 키가 존재하지 않으면 옵션 값을 지정해서 이를 출력할 수 있다.
「keys」: 모든 키 얻기
stock={
"삼성전자":"005930",
"lg에너지솔루션":"373220",
"sk하이닉스":"000660",
"현대차":"005380",
"NAVER":"035420",
"카카오":"035720"
}
stock.keys()
->dict_keys(['삼성전자', 'lg에너지솔루션', 'sk하이닉스', '현대차', 'NAVER', '카카오'])
list(stock.keys())
->['삼성전자', 'lg에너지솔루션', 'sk하이닉스', '현대차', 'NAVER', '카카오']
「values( )」: 모든 값 얻기
stock={
"삼성전자":"005930",
"lg에너지솔루션":"373220",
"sk하이닉스":"000660",
"현대차":"005380",
"NAVER":"035420",
"카카오":"035720"
}
list(stock.values())
->['005930', '373220', '000660', '005380', '035420', '035720']
「items( )」: 모든 키, 값 얻기
stock={
"삼성전자":"005930",
"lg에너지솔루션":"373220",
"sk하이닉스":"000660",
"현대차":"005380",
"NAVER":"035420",
"카카오":"035720"
}
list(stock.items())
->[('삼성전자', '005930'), ('lg에너지솔루션', '373220'), ('sk하이닉스', '000660'),
('현대차', '005380'), ('NAVER', '035420'), ('카카오', '035720')]
「len( )」: 길이 얻기
stock={
"삼성전자":"005930",
"lg에너지솔루션":"373220",
"sk하이닉스":"000660",
"현대차":"005380",
"NAVER":"035420",
"카카오":"035720"
}
len(stock)
->6
「**a, **b)」: 결합하기
stock_a={'aapl':'apple','nvda':'nvida'}
stock_b={'tsla':'tesla','f':'ford'}
{**stock_a,**stock_b}
->{'aapl': 'apple', 'nvda': 'nvida', 'tsla': 'tesla', 'f': 'ford'}
「update( )」: 결합하기
stock={
"삼성전자":"005930",
"lg에너지솔루션":"373220",
"sk하이닉스":"000660",
"현대차":"005380",
"NAVER":"035420",
"카카오":"035720"
}
stock_a={'aapl':'apple','nvda':'nvida'}
stock.update(stock_a)
stock
->{'삼성전자': '005930', 'lg에너지솔루션': '373220', 'sk하이닉스': '000660',
'현대차': '005380', 'NAVER': '035420', '카카오': '035720', 'aapl': 'apple', 'nvda': 'nvida'}
> update() 함수는 한 딕셔너리의 키와 값들을 복사해 다른 딕셔너리에 붙여준다
「del, pop( ), clear( )」: 항목 삭제
stock={
"삼성전자":"005930",
"lg에너지솔루션":"373220",
"sk하이닉스":"000660",
"현대차":"005380",
"NAVER":"035420",
"카카오":"035720"
}
del stock['NAVER']
stock
->{'삼성전자': '005930', 'lg에너지솔루션': '373220', 'sk하이닉스': '000660',
'현대차': '005380', '카카오': '035720'}
len(stock)
->5
stock.pop('현대차')
->'005380'
len(stock)
->4
stock.clear()
stock
{}
- pop()은 get()과 del을 함께 사용한다. 딕셔너리에 있는 키와 pop()의 인수가 일치한다면 해당 값을 반환한 뒤, 딕셔너리에서 해당 키값을 삭제한다. 일치하지 않는다면 예외가 발생한다.
- pop()에 두 번째 인수를 지정하면, get()과 같이 잘 작동한다
- 딕셔너리에 있는 키와 값을 모두 삭제하기 위해서 clear( )를 사용하거나 빈 딕셔너리를 이름에 할당한다
「in」
stock={
"삼성전자":"005930",
"lg에너지솔루션":"373220",
"sk하이닉스":"000660",
"현대차":"005380",
"NAVER":"035420",
"카카오":"035720"
}
'NAVER' in stock
->True
'lg전자' in stock
->False
「=」: 할당
stock={
"삼성전자":"005930",
"lg에너지솔루션":"373220",
"sk하이닉스":"000660",
"현대차":"005380",
"NAVER":"035420",
"카카오":"035720"
}
stock['nvda']='nvida'
stock_copy
->{'삼성전자': '005930', 'lg에너지솔루션': '373220', 'sk하이닉스': '000660',
'현대차': '005380', 'NAVER': '035420', '카카오': '035720', 'nvda': 'nvida'}
> 리스트와 마찬가지로 딕셔너리를 할당한 후 변경할 때 딕셔너리를 참조하는 모든 이름에 변경된 딕셔너리를 반영한다.
「copy( ), deepcopy( )」:얇은 복사, 깊은 복사
stock={
"삼성전자":"005930",
"lg에너지솔루션":"373220",
"sk하이닉스":"000660",
"현대차":"005380",
"NAVER":"035420",
"카카오":"035720"
}
stock['intl']='intel'
stock
->{'삼성전자': '005930', 'lg에너지솔루션': '373220', 'sk하이닉스': '000660',
'현대차': '005380', 'NAVER': '035420', '카카오': '035720', 'intl': 'intel'}
stock_copy
->{'삼성전자': '005930', 'lg에너지솔루션': '373220', 'sk하이닉스': '000660',
'현대차': '005380', 'NAVER': '035420', '카카오': '035720'}
- 딕셔너리 키/값을 또 다른 딕셔너리로 복사하기 위해서는 다음과 같이 할당하지 않고, copy()를 사용한다. 이것을 얇은 복사라고 한다.
- 얇은 복사는 딕셔너리 값이 불변이면 동작하지만, 가변이면 깊은 복사인 deepcopy()를 사용해야 한다.
stock={
"삼성전자":"005930",
"lg에너지솔루션":"373220",
"sk하이닉스":"000660",
"현대차":"005380",
"NAVER":"035420",
"카카오":"035720",
"nas":['tesla','intel']
}
stock_copy=stock.copy(stock)
stock
->{'삼성전자': '005930', 'lg에너지솔루션': '373220', 'sk하이닉스': '000660',
'현대차': '005380', 'NAVER': '035420', '카카오': '035720', 'nas': ['tesla', 'intel']}
stock_copy
->{'삼성전자': '005930', 'lg에너지솔루션': '373220', 'sk하이닉스': '000660',
'현대차': '005380', 'NAVER': '035420', '카카오': '035720', 'nas': ['tesla', 'intel']}
stock['nas'][0]='ford'
stock
->{'삼성전자': '005930', 'lg에너지솔루션': '373220', 'sk하이닉스': '000660',
'현대차': '005380', 'NAVER': '035420', '카카오': '035720', 'nas': ['ford', 'intel']}
stock_copy
->{'삼성전자': '005930', 'lg에너지솔루션': '373220', 'sk하이닉스': '000660',
'현대차': '005380', 'NAVER': '035420', '카카오': '035720', 'nas': ['tesla', 'intel']}
「for, in」:반복문
stock={
"삼성전자":"005930",
"lg에너지솔루션":"373220",
"sk하이닉스":"000660",
"현대차":"005380",
"NAVER":"035420",
"카카오":"035720"
}
for buy in stock:
print(buy)
->삼성전자
lg에너지솔루션
sk하이닉스
현대차
NAVER
카카오
for value in stock.values():
print(value)
->005930
373220
000660
005380
035420
035720
for item in stock.items():
print(item)
->('삼성전자', '005930')
('lg에너지솔루션', '373220')
('sk하이닉스', '000660')
('현대차', '005380')
('NAVER', '035420')
('카카오', '035720')
- 딕셔너리를 순회하면 키가 반환된다.
- 키가 아닌 값을 순회하려면 values() 메서드를 사용한다.
- 키와 값을 모두 튜플로 반환하려면 items() 메서드를 사용한다.
「셋」
> 셋(set)은 값을 버리고 키만 남은 딕셔너리와 같다. 딕셔너리와 마찬가지로 각 키는 유일해야 한다. 어떤 것이 존재하는지만 판단할 때 셋을 사용한다. 그리고 키에 어떤 정보를 첨부해서 그 결과를 얻고 싶을 때 딕셔너리를 사용한다.
「set()」:생성, 변환
「생성」
empty_set=set()
empty_set
set()
seven_numbers={0,5,6,7,8,9,4}
seven_numbers
->{0, 4, 5, 6, 7, 8, 9}
odd_numbers={3,5,7,11,13,17}
odd_numbers
->{17, 3, 5, 7, 11, 13}
> []가 빈 리스트를 생성하기 때문에 {}도 빈 셋을 생성한다고 추측할 수 있다. 그러나 {}는 빈 딕셔너리를 생성한다. 이것이 인터프리터가 빈 셋을 {} 대신 set()으로 출력하는 이유이기도 하다. 그 이유는 이미 파이썬에서 딕셔너리가 먼저 등장해서 중괄호를 차지하고 있기 때문이다.
「변환」
set('TypeError')
{'y', 'T', 'e', 'E', 'o', 'p', 'r'}
#리스트로 set 만들기
set(['python','java','go','scala'])
{'python', 'scala', 'go', 'java'}
#튜플로 set 만들기
set(('python','java','go','scala'))
{'python', 'scala', 'go', 'java'}
#딕셔너리로 set만들기
set({'python','java','go','scala'})
{'python', 'go', 'scala', 'java'}
「len()」: 길이
stock=set(['AAPL','MSFT','TSLA','AMZN'])
len(stock)
4
「add()」:추가
stock=set(['AAPL','MSFT','TSLA','AMZN'])
stock.add('INTC')
stock
->{'AMZN', 'MSFT', 'AAPL', 'TSLA', 'INTC'}
「remove()」: 삭제
stock=set(['AAPL','MSFT','TSLA','AMZN'])
stock.remove('AMZN')
stock
->{'MSFT', 'AAPL', 'TSLA', 'INTC'}
「for, in」
stock_option=set(('카카오뱅크','krafton','skiet','쏘카'))
for stock in stock_option:
print(stock)
->
카카오뱅크
쏘카
skiet
krafton
drink={
'martini':{'vodka','vermouth'},
'black russian':{'vodka','kahlua'},
'white russian':{'cream','kahlua','vodka'},
'manhattan':{'rye','vermouth','bitters'},
'screwdriver':{'orange juice','vodka'}
}
#vodka가 포함된 음료 고르기
for name, contents in drink.items():
if'vodka'in contents:
print(name)
->
martini
black russian
white russian
screwdriver
#vodka가 섞였지만, cream이 있고, vermouth가 없는 음료 고르기
for name,contents in drink.items():
if 'vodka' in contents and not ('vermouth' in contents or 'cream' in contents):
print(name)
->
black russian
screwdriver
「콤비네이션과 연산자」
#ornage juice or vermouth가 들어있는 음료
for name, contents in drink.items():
if contents&{'vermouth','orange juice'}:
print(name)
->
martini
manhattan
screwdriver
#vodca는 있지만, cream or vermouth가 없는 음료
for name, contents in drink.items():
if 'vodka' in contents and not contents &{'vermouth','cream'}:
print(name)
->
black russian
screwdriver
> set을 변수에 저장
bruss=drink['black russian']
wruss=drink['white russian']
a={1,2}
b={2,3}
> 교집합: &연산자와 intersection() 사용
a&b
->{2}
a.intersection(b)
->{2}
bruss&wruss
->{'kahlua', 'vodka'}
> 합집합: |연산자와 union() 사용
a|b
->{1, 2, 3}
a.union(b)
->{1, 2, 3}
bruss|wruss
->{'cream', 'kahlua', 'vodka'}
> 차집합: -연산자와 difference() 사용
a-b
->{1}
a.difference(b)
->{1}
bruss-wruss
->set()
wruss-bruss
->{'cream'}
> 대칭 차집합: 연산자와 symmetric_difference() 사용
a^b
->{1, 3}
a.symmetric_difference(b)
->{1, 3}
bruss^wruss
->{'cream'}
> 부분집합: <=나 issubset( ) 사용
a<=b
->False
a.issubset(b)
->False
> 진부분집합: <사용
a<b
->False
a<a
->False
bruss<wruss
->True
> 상위집합: 부분집합의 반대. >=나 issuperset() 사용
a>=b
->False
a.issuperset(b)
->False
wruss>=bruss
->True
a>=a
->True
a.issuperset(a)
->True
- 모든 셋은 자신의 상위 집합
> 상위집합: > 연산자 사용
a>b
->False
wruss>bruss
->True
a>a
False
- 모든 셋은 자신의 진상위집합이 될 수 없다.
「셋 컴프리헨션」
{표현식 for 표현식 in 순회가능한 객체}
{표현식 for 표현식 in 순회가능한 객체 in 테스트}
a_set={number for number ni range(1,6) if number % 3 ==1}
a_set
->{1,4}
「지금까지의 자료구조」
- [대괄호]를 사용한 리스트
- 콤마와 (괄호)를 사용한 튜플
- {중괄호}를 사용한 딕셔너리 또는 set