Python 6-2. 딕셔너리, 튜플, 집합

최다연·2021년 11월 7일
0

Python

목록 보기
8/10
post-thumbnail

딕셔너리

딕셔너리는 키와 값을 쌍으로 갖는 자료형이다. 키를 이용하여 값을 참조하는 특성을 지니고 있다. 딕셔너리의 항목은 {[키]:[값], [키]:[값]} 의 형식으로 나타낸다. 리스트와는 다르게 중괄호를 사용한다는 점에 주의 해야 한다.

딕셔너리를 만들고 참조하는 방법이다. 키와 값에 형의 제한은 없다. 다만 키의 값은 유일해야한다. 값은 중복이 허용된다.

딕셔너리의 삽입과 삭제

딕셔너리에 새로운 항목을 삽입하려면 딕셔너리이름[키] = 값 을 입력한다.

항목에 키가 4이고 값이 99인 새로운 항목이 추가되었다. 2라는 키가 가진 항목이 중복되었으므로 앞의 입력은 무시되었다. 만약 이미 존재하는 키에 다른 값을 입력한다면 값이 변경된다.

만약 어떤 항목을 삭제하고 싶다면 del키워드 다음에 삭제할 딕셔너리의 키값을 입력하면 된다. 그러나 존재하지 않는 항목을 삭제하면 KeyError오류가 발생한다.

딕셔너리를 위한 함수와 연산

  • len(): 딕셔너리 내의 항목의 수를 얻기 위해 사용
  • in, not in: 키가 딕셔너리에 있는지 확인
  • ==, != : 두 개의 딕셔너리가 동일한 항목을 가지고 있는지 확인

딕셔너리의 메소드이다. items 메소드를 통해 반환되는 항목들은 괄호 내에서 쉼표로 구분되어있다. 이것은 리스트나 튜플이 아닌 dict view object라는 특정 개체를 반환한다.

이 개체는 반복이 가능하기 때문에 for문을 사용할 수 있다. 이것은 딕셔너리도 마찬가지이다. 여기서 주의할 점은 딕셔너리에서 값을 받는 n은 값이 아닌 키라는 점이다. 만약 값을 출력하고 싶다면 d.values를, 키와 값의 쌍을 받고 싶다면 d.items를 입력한다. 이 때 d.items를 입력 후 나온 결과값은 튜플의 형태이다.

person의 항목에서 없는 항목을 가져오려 한다면 KeyError가 발생하고 프로그램이 종료되지만 get 메소드는 없는 항목을 가져오려고 한다면 None을 반환한다. 만약 어떤 키의 값이 None이라면 get 메소드를 사용하였을 때 당연히 None을 반환한다. 두 경우를 헷갈리지 않도록 주의해야한다. 두 경우를 구분하는 방법은 in 연산을 사용하는 것이다.

리스트와 딕셔너리의 비교

딕셔너리는 키의 값도 저장해야하기때문에 저장공간이 많이 필요하다.

리스트에서는 앞의 값이 삭제되면 앞으로 당겨진다. 그러나 딕셔너리에서는 앞의 값이 삭제되어도 키와 값의 쌍은 변하지 않는다. 리스트에서는 정의된 순서가 의미가 있지만 딕셔너리에서는 의미가 없다.

리스트는 대괄호를, 딕셔너리는 중괄호를 사용한다. 값에 접근하려면 리스트는 인덱스 번호를, 딕셔너리는 키를 이용한다.

튜플

튜플은 여러 개의 요소를 가지는 컬렉션 자료형이다. (1, 10, 30)과 같이 소괄호를 사용하며 쉼표로 구분을 한다. 튜플도 리스트와 마찬가지로 인덱스를 사용한다. 그러나 리스트와는 달리 한 번 정해진 요소의 순서를 바꿀 수 없다. 또한 튜플 내부의 객체를 변경하거나 삭제하는 것도 불가능하다는 교환불가능(immutable) 속성을 가지고 있다.

튜플을 생성하는 여러가지 방법이다. 리스트와 비슷한 부분이 많다.

튜플은 내부의 값을 변경할 수 없으므로 개별 항목에 대한 할당 연산은 오류를 발생시킨다.

패킹은 하나의 변수에 여러 개의 값을 넣는 것을 의미하며, 언패킹은 그 반대로 패킹된 변수가 있으면 여기에서 여러 개의 값을 꺼내오는 것을 의미한다.

a,b = b,a라는 한 줄을 이용하여 두 변수의 값을 바꾸는 스왑을 할 수 있다. 효율성이 좋고 코드가 직관적이다.

튜플의 연산

튜플 역시 +와 *연산을 사용할 수 있다. +현산은 피연산 튜플의 원소들을 서로 연결하는 기능을 가지고 있다. *은 튜플과 정수 사이의 연산이 되어야한다.

튜플의 메소드

튜플에서 사용되는 메소드는 다음과 같다.

  • count(x) : 튜플 내에 특정 값 x가 몇 개 있는가를 알려준다.
  • index(x) : 튜플 내의 특정 값 x의 위치를 알려준다.

튜플 내의 항목을 변경하고 싶다면 튜플을 list()함수를 사용하여 리스트로 변경한 뒤 이 리스트의 값을 변경시킨 후, tuple()함수를 사용하여 다시 리스트를 튜플로 만드는 방법을 사용한다.

집합

집합은 순서가 없는 자료형이다. 중복이 허용되지 않으므로 인덱스를 사용하지 못한다. 동일한 값을 가지는 항목의 중복이 허용되지 않는다. 교집합, 합집합, 차집합 등의 집합 연산 수행이 가능하다. 집합은 중괄호를 이용하여 나타낸다.

집합을 만드는 여러가지 방법이다. 빈 집합을 만들 때 {}라고 한다면 이것은 딕셔너리를 의미하므로 주의해야 한다.

집합의 메소드

집합의 메소드는 다음과 같다

add, discard, clear는 집합이 변경 되는 것, union, difference, intersection, symmetric_difference는 새로운 집합을 반환하는 것이다.

교집합은 &, 합집합은|, 차집합은 -, 대칭 차집합은 ^연산을 사용한다.

곱집합(데카르트 곱)

곱집합이란 집합 A의 모든 원소 a와 집합 B의 모든 원소 b를 이용해 만들 수 있는 튜플 (a,b)의 집합이다. 곱집합은 AXB로 표현한다.

*연산자는 패킹 기능을 하는 연산자라고 할 수 있다. 함수에서 입력 받을 때 *이면 튜플, 즉 위치인자를 **이면 딕셔너리 형태로 키워드 인자를 묶어서 전달한다.


*, ** 연산자가 인자를 받는 곳이 아닌 다른 곳에서 쓰인다면 언패킹의 의미를 갖고 있다.


첫번째 줄에서 c는 3, 4, 5, 6이 패킹된 리스트의 형태로 전달이 된다.

위 내용을 이용하여 곱집합을 출력하는 내용이다.

zip()함수를 이용한 집적화

리스트, 딕셔너리, 집합, 튜플과 같은 자료형은 하나씩 꺼내어 반복하여 처리할 수 있는 자료형이므로 반복가능자료형이라고 한다. 반복가능 자료형 여러 개 인자로 넘겨주면, 이들을 합쳐서 튜플 반복자를 반환하는 함수이다. zip()함수는 다음과 같이 여러 개의 반복가능 자료형을 받을 수 있다. 이를 집적화라고 한다.

집적화된 개체들은 하나의 튜플 형태로 저장된다. 한 번 z를 사용한다면 그 원소들은 모두 사라지고 그 안에 남아있는 원소는 없게 된다.

집적화는 두 묶음에서 서로 같은 위치에 있는 것끼리 모은다.

문자열을 원소로 하는 리스트를 반복가능 자료로 zip()함수에 넘긴 경우 생성되는 원소가 튜플이리 때문에 'a'가 아니라 'a'라는 하나의 원소를 가진 튜플로 반환됨에 주의해야 한다.

원소의 개수가 다르다면 가장 짧은 원소를 기준으로 묶음을 만든다.
zip()함수를 통해 묶여진 튜플들을 원래의 반복가능 자료들로 되돌리는 작업을 하고 싶다면 zip()함수에 묶인 자료를 인자로 입력하고 *연산자를 인자 앞에 붙인다.

0개의 댓글