언어/PYTHON

딕셔너리와 셋

빨대도둑 2022. 10. 14. 11:31

딕셔너리와 리스트는 비슷하다. 다른 점은 항목의 순서를 따지지 않으며, 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

 

'언어 > PYTHON' 카테고리의 다른 글

객체, 클래스  (0) 2022.11.09
함수, 예외  (0) 2022.10.17
튜플, 리스트  (1) 2022.10.13
텍스트 문자열  (0) 2022.10.12
조건, 반복  (0) 2022.10.12