점프 투 파이썬 00장 들어가기 전에 00-1 머리말 00-2 저자소개 00-3 주요변경이력 00-4 책구입안내 01장 파이썬이란 무엇인가? 01-1 파이썬 시작하기 01-2 파이썬의 특징 01-3 파이썬으로 무엇을 할 수 있을까? 01-4 파이썬 설치하기 01-5 파이썬 둘러보기 02장 파이썬 프로그래밍의 기초, 자료형 02-1 숫자형 02-2 문자열 자료형 02-3 리스트 자료형 02-4 튜플 자료형 02-5 딕셔너리 자료형 02-6 집합 자료형 02-7 자료형의 참과 거짓 02-8 자료형의 값을 저장하는 공간, 변수 03장 프로그램의 구조를 쌓는다! 제어문 03-1 if문 03-2 while문 03-3 for문 04장 프로그램의 입력과 출력은 어떻게 해야 할까? 04-1 함수 04-2 사용자 입력과 출력 04-3 파일 읽고 쓰기 05장 파이썬 날개달기 05-1 클래스 05-2 모듈 05-3 패키지 05-4 예외 처리 05-5 내장 함수 05-6 외장 함수 06장 파이썬 프로그래밍, 어떻게 시작해야 할까? 06-1 내가 프로그램을 만들 수 있을까? 06-2 3과 5의 배수 합하기 06-3 게시판 페이징하기 06-4 간단한 메모장 만들기 06-5 탭을 4개의 공백으로 바꾸기 06-6 하위 디렉터리 검색하기 06-7 코딩도장 07장 파이썬 정규표현식과 XML 07-1 정규 표현식 살펴보기 07-2 정규 표현식 시작하기 07-3 강력한 정규 표현식의 세계로 07-4 파이썬으로 XML 처리하기 08장 마치며 A. 부록 A-1 파이썬 2.7 vs 파이썬 3
Published with WikiDocs
  1. 점프 투 파이썬
  2. 02장 파이썬 프로그래밍의 기초, 자료형
  3. 02-6 집합 자료형
  1. WikiDocs

02-6 집합 자료형

집합 자료형은 어떻게 만들까?

집합(set)은 파이썬 2.3부터 지원되기 시작한 자료형으로, 집합에 관련된 것들을 쉽게 처리하기 위해 만들어진 자료형이다.

집합 자료형은 다음과 같이 set 키워드를 이용해 만들 수 있다.

>>> s1 = set([1,2,3])
>>> s1
{1, 2, 3}

위와 같이 set()의 괄호 안에 리스트를 입력하여 만들거나 아래와 같이 문자열을 입력하여 만들 수도 있다.

>>> s2 = set("Hello")
>>> s2
{'e', 'l', 'o', 'H'}

집합 자료형의 특징

자, 그런데 위에서 살펴본 set("Hello")의 결과가 좀 이상하지 않은가? 분명 "Hello"라는 문자열로 set 자료형을 만들었는데 생성된 자료형에는 l 문자가 하나 빠져 있고 순서도 뒤죽박죽이다. 그 이유는 set에는 다음과 같은 2가지 큰 특징이 있기 때문이다.

  • 중복을 허용하지 않는다.
  • 순서가 없다(Unordered).

리스트나 튜플은 순서가 있기(ordered) 때문에 인덱싱을 통해 자료형의 값을 얻을 수 있지만 set 자료형은 순서가 없기(unordered) 때문에 인덱싱으로 값을 얻을 수 없다. 이는 마치 02-5절에서 살펴본 딕셔너리와 비슷하다. 딕셔너리 역시 순서가 없는 자료형이라 인덱싱을 지원하지 않는다. 만약 set 자료형에 저장된 값을 인덱싱으로 접근하려면 다음과 같이 리스트나 튜플로 변환한 후 해야 한다.

(※ 중복을 허용하지 않는 set의 특징은 자료형의 중복을 제거하기 위한 필터 역할로 종종 사용되기도 한다.)

>>> s1 = set([1,2,3])
>>> l1 = list(s1)
>>> l1
[1, 2, 3]
>>> l1[0]
1
>>> t1 = tuple(s1)
>>> t1
(1, 2, 3)
>>> t1[0]
1

집합 자료형 활용하는 방법

교집합, 합집합, 차집합 구하기

set 자료형이 정말 유용하게 사용되는 경우는 다음과 같이 교집합, 합집합, 차집합을 구할 때이다.

우선 다음과 같이 2개의 set 자료형을 만든 후 따라 해보자. s1은 1부터 6까지의 값을 가지게 되었고, s2는 4부터 9까지의 값을 가지게 되었다.

>>> s1 = set([1, 2, 3, 4, 5, 6])
>>> s2 = set([4, 5, 6, 7, 8, 9])

1. 교집합

s1과 s2의 교집합을 구해 보자.

>>> s1 & s2
{4, 5, 6}

"&" 기호를 이용하면 교집합을 간단히 구할 수 있다.

또는 다음과 같이 intersection 함수를 사용해도 동일한 결과를 리턴한다.

>>> s1.intersection(s2)
{4, 5, 6}

s2.intersection(s1)을 사용해도 결과는 같다.

2. 합집합

합집합은 다음과 같이 구할 수 있다. 이때 4, 5, 6처럼 중복해서 포함된 값은 한 개씩만 표현된다.

>>> s1 | s2
{1, 2, 3, 4, 5, 6, 7, 8, 9}

"|" 기호를 이용한 방법이다.

>>> s1.union(s2)
{1, 2, 3, 4, 5, 6, 7, 8, 9}

또는 union 함수를 이용하면 된다. 교집합에서 사용했던 intersection 함수와 마찬가지로 s2.union(s1)을 사용해도 동일한 결과를 리턴한다.

3. 차집합

차집합은 다음과 같이 구할 수 있다.

>>> s1 - s2
{1, 2, 3}
>>> s2 - s1
{8, 9, 7}

빼기(-) 기호를 이용한 방법이다.

>>> s1.difference(s2)
{1, 2, 3}
>>> s2.difference(s1)
{8, 9, 7}

difference 함수를 이용해도 차집합을 구할 수 있다.

집합 자료형 관련 함수들

값 1개 추가하기(add)

이미 만들어진 set 자료형에 값을 추가할 수 있다. 1개의 값만 추가(add)할 경우에는 아래와 같이 한다.

>>> s1 = set([1, 2, 3])
>>> s1.add(4)
>>> s1
{1, 2, 3, 4}

값 여러 개 추가하기(update)

여러 개의 값을 한꺼번에 추가(update)할 때는 다음과 같이 하면 된다.

>>> s1 = set([1, 2, 3])
>>> s1.update([4, 5, 6])
>>> s1
{1, 2, 3, 4, 5, 6}

특정 값 제거하기(remove)

특정 값을 제거하고 싶을 때는 아래와 같이 하면 된다.

>>> s1 = set([1, 2, 3])
>>> s1.remove(2)
>>> s1
{1, 3}

지금까지 파이썬의 가장 기본이 되는 자료형인 숫자, 문자열, 리스트, 튜플, 딕셔너리, 집합에 대해서 알아보았다. 여기까지 잘 따라온 독자라면 파이썬에 대해서 대략 50% 정도 습득했다고 보아도 된다. 그만큼 자료형은 중요하고 프로그램의 근간이 되기 때문에 확실하게 해놓지 않으면 좋은 프로그램을 만들 수 없다. 책에 있는 예제들만 따라 하지 말고 직접 여러 가지 예들을 테스트해 보며 02-1부터 02-6절까지의 자료형들에 익숙해지기를 당부한다.

마지막 편집일시 : 2017년 1월 16일 7:57 오후
댓글 13 피드백
완전 초보입니다. 잘 배우고 있습니다. 궁금해서 문의드립니다. 리스트를 입력으로 집합을 만들 수 있는데 , 반대의 경우 집합을 리스트로 변형 가능한지요? - 김종배, 2014년 6월 20일 3:01 오후
@김종배님, 다음과 같이 해 보세요. >>> s1 = set([1,2,3]) >>> list(s1) s1 이라는 set을 list로 변경하는 예입니다. - 박응용, 2014년 7월 23일 1:06 오전
문자열을 하나의 집합으로 볼 수는 없나요?? c++ stl 에서의 set 에서처럼요.. set<string> s; s.insert("Hello"); 하나의 문자열을 하나의 set node로 인식합니다.. - 성욱, 2014년 12월 2일 5:29 오후
안녕하세요? 혹시 집합의 추가에서 add 하게 되면 순서 원래 집합에서 뒤로만 추가가 되나요?? 아니면 추가되는 순서가 따로 있는건가요?? - 지수, 2015년 1월 9일 4:46 오후
@지수님, 파이썬 set 자료형은 순서가 없는(unordered) 자료형입니다. 따라서 순서를 고려해야 하는 경우라면 set말고 다른것을 사용하셔야 합니다. - 박응용, 2015년 1월 10일 1:19 오전
안녕하세요. 궁금한 것이 있습니다. 1. set에 숫자와 문자열을 같이 넣을 수 있나요? 있다면 어떻게 해야 하나요? >>> s1= set([1,2,2,3, "dde"]) >>> s1 {1,2,3,'dde'} 이렇게 시도를 해보았는데.. 일단 dde가 나누어 지지 않고 열로 남아 있네요 2. 중괄호로 그냥 쓰면 어떻게 되나요? 딕셔너리하고 헷갈리게 되는 것인지요? 키와 밸류값을 설정하는 것은 아닌데... >>> s1 = {2,2,3,1} >>> s1 {1,2,3} 으로 집합이 맞는 것 같은데 문자로 시도하니 이상하네요. >>> s2 = {'abcd'} >>> s2 {'abcd'} 이런저런 시도를 해보았는데, 어떻게 되고 있는 것인지 잘 모르겠습니다. - 광선, 2015년 1월 11일 7:39 오후
@광선님, set('abc')와 같이 사용하면 {'a', 'b', 'c'}와 같은 결과를 얻을 수 있습니다. - 박응용, 2015년 1월 12일 8:53 오전
저는 s1= set(1,2,3,'hello') 로 시도해봤는데 오류가 뜨네용, 문자열과 숫자는 같이 집합에 넣지 못하는 것인가요? - 진선, 2015년 9월 8일 7:30 오후
set()은 argument가 하나뿐인 함수라 오류가 발생한 것 같습니다. s1 = {1, 2, 3, 'hello'} 이렇게 하니 숫자와 문자를 같이 넣을 수 있네요. - 비완, 2015년 10월 14일 5:16 오후
SET 는 안에 있는 자료를 REMOVE로 하나씩 밖에 제거를 못하나요? UPDATE 처럼 다수의 값을 제거하고 싶으면 어떻게 하나요? - Kim, 2016년 10월 20일 4:56 오후
연습문제가 어디있는지요? - Yongho, 2016년 11월 10일 8:08 오전
@Yongho님, 연습문제는 오프라인 책에만 추가되어 있습니다. 위 문장은 수정을 해 놓겠습니다. 알려주셔서 감사합니다. - 박응용, 2016년 11월 10일 9:57 오전
강좌 매우 유용하게 잘 보고 있습니다. 살짝 눈에 띄었는데, []는 가변형 리스트, ()는 고정형 튜플, {}는 하이브리드 딕셔너리형에 쓰도록 되어있는가보네요. 집합 자료형을 묶을때 {}를 쓴다는것 자체가 이미 딕셔너리형 특징을 갖는다는 뜻을 포함하는것 같아요. 처음 배우는 사람이 꼭 알아야 할 내용은 아니겠습니다만, 이렇게 분류해서 추가 설명해주시면 누군가에게는 도움이 될 수도 있을 것 같아서 답글 남깁니다^^ 혹은 이후 강좌에 등장하는 내용이면 스포일러 죄송하고요 ㅎ - cfranck, 2016년 12월 15일 2:41 오후
※ 댓글 작성은 로그인이 필요합니다. (또는 피드백을 이용해 주세요.)
  • 이전글 : 02-5 딕셔너리 자료형
  • 다음글 : 02-7 자료형의 참과 거짓
TOP

이 페이지에 대한 피드백을 남겨주세요

※ 피드백은 저자에게 e-메일로 전달됩니다.