25.1.4 딕셔너리에서 키-값 쌍 삭제하기
pop(키)는 딕셔너리에서 해당 키-값 쌍을 삭제하고 삭제한 값을 반환한다.
pop(키, 기본값)처럼 기본값을 지정하면 딕셔너리에 키가 있다면 그 키에 해당하는 값을 반환하지만, 키가 없다면 기본값만 반환한다.
del dic[key]의 형식으로도 키-값쌍을 삭제할 수 있다.
25.1.5 딕셔너리에서 임의의 키-값 쌍 삭제하기
popitem()은 딕셔너리에서 임의의 키-값쌍을 삭제하고 삭제한 키-값쌍을 튜플로 반환한다. 3.6이상 버전에서는 마지막 키-값쌍을 삭제하고 3.5 이하 버전에서는 무작위로 삭제하여 매번 삭제하는 키-값쌍이 달라진다.
25.1.6 딕셔너리의 모든 키-값 쌍 삭제하기
clear()로 딕셔너리의 모든 키-값쌍을 삭제하여 빈 딕셔너리로 만들 수 있다.
25.1.7 딕셔너리에서 키의 값을 가져오기
get(키)는 딕셔너리에서 지정한 키에 해당하는 값을 가져온다.
get(키,기본값)의 형태로 사용하면 키가 있을 경우 키의 값을 반환하지만, 키가 없을 경우 기본값을 반환한다.
25.1.8 딕셔너리에서 키-값 쌍을 모두 가져오기
딕셔너리에서 키와 값을 가져오는 메서드는 다음과 같다.
- items : 키-값쌍을 모두 가져옴
- keys : 키를 모두 가져옴
- values : 값을 모두 가져옴
25.1.9 리스트와 튜플로 딕셔너리 만들기
먼저 키로 사용할 값들이 들어있는 리스트나 튜플을 준비해야 한다. 그리고 dict.fromkeys()에 키가 들어있는 리스트를 넣으면 딕셔너리가 생성된다.
dict.fromkeys(키리스트)의 형식으로 딕셔너리를 생성하면 값들은 모두 None가 되고, dict.fromkeys(키리스트, 값)의 형식으로 딕셔너리를 생성하면 값들은 모두 지정한 값이 된다.
defaultdict 사용하기
딕셔너리는 없는 키에 접근하면 에러를 발생한다. collections 모듈의 defaultdict를 사용하면 없는 키에 접근하더라도 에러를 발생하지 않고 기본값을 반환한다. defaultdicr()괄호 안에는 기본값 생성 함수가 들어간다.
int()에 아무 값도 넣지 않고 호출하면 0이 나오기 때문에 int 의 기본값으로 0이 나온다.
다른 값을 기본값으로 넣고 싶으면 다음과 같이 사용하면 된다.
25.2 반복문으로 딕셔너리의 키-값 쌍을 모두 출력하기
다음과 같이 for 반복문에 딕셔너리를 지정한 후에 i를 출력하면 키값만 출력된다.
값까지 같이 출력하려면 다음과 같이 for in 뒤에 딕셔너리를 지정하고 items를 사용해야 한다.
키와 값 순서대로 키는 k에 지정하고, 값은 v에 지정하여 출력할 수 있다.
for in 뒤에 딕셔너리 변수가 아니라 딕셔너리를 직접 지정해도 된다.
25.2.1 딕셔너리 키만 출력하기
keys()를 사용하면 된다.
25.2.2 딕셔너리의 값만 출력하기
values()를 사용하면 된다.
25.3 딕셔너리 표현식 사용하기
딕셔너리도 for 반복문과 if조건문을 이용하여 딕셔너리를 생성할 수 있다. 사용 방법은 다음과 같다.
{키:값 for 키, 값 in 딕셔너리}
dict({키:값 for 키, 값 in 딕셔너리})
for in 다음에 딕셔너리를 지정하여 items()로 키,값 모두를 가져와서 딕셔너리를 생성한다.
다음과 같이 keys()로 키만 가져와 특정 값을 넣거나, values()로 값만 가져와 키로 사용하거나, 키와 값의 자리를 바꿀 수도 있다.
25.3.1 딕셔너리 표현식에서 if 조건문 사용하기
딕셔너리는 특정 키를 삭제하는 메서드만 제공하고, 특정 값을 찾아서 삭제하는 메서드는 제공하지 않는다. 반복문을 통해 삭제하려고 하는 값을 찾으면 키를 통해 삭제하려는 방식으로 코드를 구성하면 삭제하고 나서도 반복을 진행해야 하기 때문에 딕셔너리 크기가 중간에 바뀌어서 에러가 발생하게 된다.
이와 같은 경우 딕셔너리 표현식에서 if 조건문을 사용하여 삭제할 값을 제외할 수 있다.
{키: 값 for 키, 값 in 딕셔너리 if 조건식}
dict({키: 값 for 키, 값 in 딕셔너리 if 조건식})
위와 같은 방식은 키-값 쌍을 삭제하는 것이 아니라 삭제할 키-값 쌍을 제외하고 새로운 딕셔너리를 만드는 것이다.
25.4 딕셔너리 안에서 딕셔너리 사용하기
딕셔너리는 다음과 같이 값 부분에 다시 딕셔너리가 계속 들어갈 수 있다.
딕셔너리 = {키1: {키A: 값:A}, 키2: {키B: 값B}}
다음은 지구형 행성의 반지름, 질량, 공전주기를 딕셔너리로 표현한 예시이다.
terrestrial_planet = {
'Mercury': {
'mean_radius': 2439.7,
'mass': 3.3022E+23,
'orbital_period': 87.969
},
'Venus': {
'mean_radius': 6051.8,
'mass': 4.8676E+24,
'orbital_period': 224.70069,
},
'Earth': {
'mean_radius': 6371.0,
'mass': 5.97219E+24,
'orbital_period': 365.25641,
},
'Mars': {
'mean_radius': 3389.5,
'mass': 6.4185E+23,
'orbital_period': 686.9600,
}
}
print(terrestrial_planet['Venus']['mean_radius'])
딕셔너리 안에 있는 딕셔너리에 접근하려면 딕셔너리 뒤에 [ ](대괄호)를 단계만큼 붙이고 키를 지정해주면 된다.
딕셔너리[키][키]
25.5 딕셔너리의 할당과 복사
딕셔너리를 다른 변수에 할당하면 두 딕셔너리는 이름만 다를 뿐 같은 객체이다.
같은 객체이기 때문에 한 변수의 키-값을 변경하면 둘 다 반영된다.
x와 y를 다른 두 딕셔너리로 만드려면 copy()메서드를 사용하여 모든 키-값 쌍을 복사하면 된다.
x와 y는 다른 객체이기 때문에 is로 비교하면 false가 나오며 둘 중 한 딕셔너리의 값을 변경해도 다른 딕셔너리에 반영되지 않는다.
25.5.1 중첩 딕셔너리의 할당과 복사 알아보기
중첩 딕셔너리는 copy메서드로 복사해도 한 딕셔너리의 값 변경시 다른 딕셔너리에도 적용된다.
중첩 딕셔너리를 완전히 복사하려면 copy모듈의 deepcopy함수를 사용해야 한다.
25.6 퀴즈
정답은 c,e이다.
정답은 b,c이다. setdefault는 키만 지정하면 값은 None가 되고, keys는 키만 가져온다.
정답은 b,c,e 이다.
정답은 d 이다.
정답은 d이다.
정답은 c이다.
25.7 연습문제: 평균 점수 구하기
정답은 다음 코드와 같다.
average = sum(maria.values()) / len(maria)
25.8 심사문제: 딕셔너리에서 특정 값 삭제하기
정답은 다음 코드와 같다.
x = {key: value for key, value in x.items() if value != 30 and key != 'delta'}
삭제해야 하는 요소 중에 해당하는 값을 사용하는 경우도 있기 때문에 표현식을 사용해야 한다.
Unit 26. 세트 사용하기
파이썬에서는 집합을 표현하는 세트 자료형을 제공한다. 세트는 합집합, 교집합, 차집합 등의 연산이 가능하다.
26.1 세트 만들기
세트는 { }(중괄호) 안에 값을 저장하고, 콤마로 구분한다.
세트는 요소의 순서가 정해져 있지 않고, 요소가 중복되지 않는다. 같은 값을 두 개 이상 넣는다면, 하나만 저장된다. 요소의 순서가 정해져 있지 않기 때문에 인덱스로 특정 요소를 출력할 수 없다.
26.1.1 세트에 특정 값이 있는지 확인하기
in 연산자를 사용하면 된다. 값이 있으면 True, 없으면 False가 나온다.
in 앞에 not을 붙이면 값이 없는지 확인한다.
26.1.2 set를 사용하여 세트 만들기
set(반복 가능한 객체)와 같은 형식으로 세트를 만든다. 반복 가능한 객체에서 중복된 요소는 제거된다.
빈 세트는 set에 아무것도 지정하지 않으면 된다.
세트는 세트 안에 세트를 넣을 수 없다.
프로즌세트 라는 내용을 변경할 수 없는 세트도 있다.
프로즌세트는 요소를 추가, 삭제 하는 연산 메서드를 사용할 수 없고, 요소를 변경할 수 없다.
프로즌세트는 다음과 같이 프로즌세트를 중첩해서 넣을 수 있다.
26.2 집합 연산 사용하기
| 연산자와 set.union()메서드는 합집합을 구한다.
& 연산자와 set.intersection()메서드는 교집합을 구한다.
-연산자와 set.difference()메서드는 차집합을 구한다.
^연산자와 set.symmetric_difference()메서드는 대칭 차집합을 구한다. 대칭 차집합은 xor연산자의 특성을 그대로 따라 두 집합중 겹치지 않는 요소만 포함한다.
26.2.1 집합 연산 후 할당 연산자 사용하기
세트 자료형에 |,&,-,^연산자와 할당연산자 =을 함께 사용하면 집합 연산의 결과를 다시 변수에 할당한다.
|= 은 현재 세트에 다른 세트를 더하며 update()메서드와 같은 동작을 한다.
&= 와 intersection_update() 메서드는 현재 세트와 다른 세트 중 겹치는 요소만 저장한다.
-= 와 difference_update 메서드는 현재 세트에서 다른 세트를 뺀다.
^= 와 symmetric_difference_update()메서드는 현재 세트와 다른 세트중 겹치지 않는 요소만 현재 세트에 저장한다.
26.2.2 부분 집합과 상위 집합
세트는 부분집합, 진부분집합, 상위집합, 진상위집합과 같이 속하는 관계를 표현할 수 있다.
<=와 issubset() 메서드는 현재 세트가 다른 세트의 부분집합인지 확인한다.
<은 현재 세트가 다른 세트와 진부분집합인지 확인한다. 같은 기능을 하는 메서드는 없다. 진부분집합은 부분집합이지만 두 집합이 같지 않을때 참이다.
>=와 issuperset()메서드는 현재 세트가 다른 세트의 상위 집합인지 확인한다. 두 집합이 같을때도 참이다.
> 은 현재 세트가 다른 세트의 진상위집합인지 확인한다. 같은 기능을 하는 메서드는 없다. 진상위집합은 상위집합이지만 두 집합이 같지 않을 때 참이다.
26.2.3 세트가 같은지 다른지 확인하기
== 연산자를 이용하여 세트가 서로 같은지 확인할 수 있다. 세트의 요소는 순서가 없으므로 요소만 같으면 참이다.
!= 연산자는 세트가 다른지 확인한다.
26.2.4 세트가 겹치지 않는지 확인하기
disjoint()는 현재 세트가 다른 세트와 겹치지 않는지 확인한다. 겹치는 요소가 없으면 True, 있으면 False를 반환한다.
26.3 세트 조작하기
26.3.1 세트에 요소 추가하기
add(요소)는 세트에 요소를 추가한다.
26.3.2 세트에서 특정 요소를 삭제하기
remoce(요소)는 세트에서 특정 요소를 삭제하고, 요소가 없으면 에러를 발생한다.
discard(요소)는 세트에서 특정 요소를 삭제하고, 요소가 없으면 그냥 넘어간다.
26.3.3 세트에서 임의의 요소 삭제하기
pop()는 세트에서 임의의 요소를 삭제하고 해당 요소를 반환한다. 만약 요소가 없으면 에러를 발생한다.
26.3.4 세트의 모든 요소 삭제하기
clear()로 세트의 모든 요소를 삭제할 수 있다.
26.3.5 세트의 요소 개수 구하기
len(세트)로 세트의 요소 개수를 구할 수 있다.
26.4 세트의 할당과 복사
세트를 만든뒤 다른 변수에 할당하면 이 두 변수는 같은 세트를 가리키기 때문에 is 연산자로 비교해보면 True가 나오고, 요소를 추가하면 두 세트 모두 반영된다.
세트 a와 b를 완전히 두 개로 만드려면 copy()메서드로 모든 요소를 복사해야 한다.
복사를 하면 완전히 다른 두 객체이기 때문에 is 연산자로 비교하면 False가 나오며 값을 추가해도 다른 세트에 반영되지 않는다.
26.5 반복문으로 세트의 요소를 모두 출력하기
간단하게 for in 뒤에 세트만 지정하면 된다.
세트의 요소는 순서가 없기 때문에 숫자가 아닌 세트는 출력할 때 마다 순서가 달라질 수 있다.
다음과 같이 in 다음에 세트를 직접 지정해도 된다.
26.6 세트 표현식 사용하기
다음과 같이 세트 안에 for 반복문을 지정하면 세트를 생성할 수 있다.
{식 for 변수 in 반복가능한객체}
set(식 for 변수 in 반복가능한객체)
문자열 apple에서 중복되지 않은 문자인 a,p,l,e를 꺼내서 세트를 만든다.
26.6.1 세트 표현식에 if 조건문 사용하기
다음과 같이 if 조건문은 for 반복문 뒤에 지정한다.
{식 for 변수 in 세트 if 조건식}
set(식 for 변수 in 세트 if 조건식)
if 조건문을 지정하면 if조건문에서 특정 요소를 제외한 뒤 세트를 생성한다.
26.7 퀴즈
정답은 b이다. b는 빈 딕셔너리를 생성하는 방식이다.
정답은 b,e이다. a ^ b는 {1,2,4,5} 이고, e는 {4,5}이다.
정답은 b,d이다. 진부분집합을 구하는 메서드는 없고, 진상위집합은 두 세트가 같으면 거짓이다.
정답은 a,b,c 이다.
정답은 c,d이다. symmetric_difference_update는 ^=와 같고, issupperset는 >=와 같다.
정답은 a,c이다.
26.8 연습문제: 공배수 구하기
정답은 다음 코드와 같다.
{i for i in range(1,101) if i % 3 == 0}
{i for i in range(1,101) if i % 5 == 0}
1부터 100까지 range()로 만들고 그 중 3의배수인 것과 5의 배수인 것을 각 세트에 넣는다.
26.9 심사문제: 공약수 구하기
정답은 다음 코드와 같다.
a, b = map(int, input().split())
a = {i for i in range(1, a+1) if a % i == 0}
b = {i for i in range(1, b+1) if b % i == 0}
a, b를 정수로 입력 받고, 1 부터 입력 받은 수까지 입력받은 수와 나눴을때 나머지가 0이 되는 숫자들을 각 세트에 저장했다.
'Project H4C Study Group' 카테고리의 다른 글
[Project H4C] 파이썬 코딩도장(11) (0) | 2021.01.31 |
---|---|
[Project H4C] 파이썬 코딩도장(10) (0) | 2021.01.29 |
[Project H4C] 파이썬 코딩도장(8) (0) | 2021.01.26 |
[Project H4C] 파이썬 코딩도장(7) (0) | 2021.01.26 |
[Project H4C] 파이썬 코딩도장(6) (0) | 2021.01.25 |