{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "***\n", "# 11. 튜플과 집합\n", "***\n", "***" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "## 1 튜플 활용법\n", "***\n", "- 튜플(Tuples): 순서있는 임의의 객체 모음 (시퀀스형)\n", "- 튜플은 변경 불가능(Immutable)\n", "- 시퀀스형이 가지는 다음 연산 모두 지원\n", " - 인덱싱, 슬라이싱, 연결, 반복, 멤버쉽 테스트" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1-1 튜플 연산" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " \n" ] } ], "source": [ "t1 = () # 비어있는 튜플\n", "t2 = (1,2,3) # 괄호 사용\n", "\n", "t3 = 1,2,3 # 괄호가 없어도 튜플이 됨\n", "print(type(t1), type(t2), type(t3))\n", "\n", "\n", "# " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n" ] } ], "source": [ "r1 = (1,) # 자료가 한 개일 때는 반드시 콤마가 있어야 한다.\n", "r2 = 1, # 괄호는 없어도 콤마는 있어야 한다.\n", "print(type(r1))\n", "print(type(r2))\n", "\n", "# \n", "# " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1, 2, 3, 1, 2, 3)\n", "(1, 2, 3, 'PyKUG', 'users')\n", "(1, 2, 3)\n", "\n", "1 (2, 3)\n", "3\n", "True\n" ] } ], "source": [ "t = (1, 2, 3)\n", "print(t * 2) # 반복\n", "print(t + ('PyKUG', 'users')) # 연결\n", "print(t)\n", "print()\n", "\n", "print(t[0], t[1:3]) # 인덱싱, 슬라이싱\n", "print(len(t)) # 길이\n", "print(1 in t) # 멤버십 테스트" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "'tuple' object does not support item assignment", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m100\u001b[0m \u001b[0;31m# 튜플은 변경 불가능, 에러발생\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" ] } ], "source": [ "t[0] = 100 # 튜플은 변경 불가능, 에러발생" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))\n", "([1, 2, 3], (1, 2, 4))\n", "({1: 'abc', 2: 'def'}, (1, 2, 3))\n" ] } ], "source": [ "t = (12345, 54321, 'hello!') \n", "u = t, (1, 2, 3, 4, 5) # 튜플 내부 원소로 다른 튜플을 가질 수 있음\n", "print(u)\n", "\n", "t2 = [1, 2, 3] # 튜플 내부 원소로 리스트 가질 수 있음 \n", "u2 = t2, (1, 2, 4)\n", "print(u2)\n", "\n", "t3 = {1:\"abc\", 2:\"def\"} # 튜플 내부 원소로 사전 가질 수 있음 \n", "u3 = t3, (1, 2, 3)\n", "print(u3)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " \n", "1\n", "2\n", "3\n" ] } ], "source": [ "x, y, z = 1, 2, 3 # 튜플을 이용한 복수 개의 자료 할당\n", "print(type(x), type(y), type(z))\n", "print(x)\n", "print(y)\n", "print(z)\n", "\n", "\n", "# \n", "# 1\n", "# 2\n", "# 3" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2 1\n" ] } ], "source": [ "x = 1\n", "y = 2\n", "x, y = y, x # 튜플을 이용한 두 자료의 값 변경\n", "print(x, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1-2 패킹과 언패킹" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 패킹 (Packing): 하나의 튜플 안에 여러 개의 데이터를 넣는 작업" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "t = 1, 2, 'hello'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 언패킹 (Unpacking): 하나의 튜플에서 여러 개의 데이터를 한꺼번에 꺼내와 각각 변수에 할당하는 작업" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x, y, z = t" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 리스트로도 비슷한 작업이 가능하지만, 단순 패킹/언패킹 작업만을 목적으로 한다면 튜플 사용 추천" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "foo\n", "bar\n", "4\n", "5\n", "\n", "foo\n", "bar\n", "4\n", "5\n" ] } ], "source": [ "a = ['foo', 'bar', 4, 5]\n", "[x, y, z, w] = a\n", "print(x)\n", "print(y)\n", "print(z)\n", "print(w)\n", "print()\n", "\n", "x, y, z, w = a\n", "print(x)\n", "print(y)\n", "print(z)\n", "print(w)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 튜플과 리스트와의 공통점\n", " - 원소에 임의의 객체를 저장\n", " - 시퀀스 자료형\n", " - 인덱싱, 슬라이싱, 연결, 반복, 멤버쉽 테스트 연산 지원\n", " \n", "- 리스트와 다른 튜플만의 특징\n", " - 변경 불가능 (Immutable)\n", " - 튜플은 count와 index 외에 다른 메소드를 가지지 않는다." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4\n", "0\n" ] } ], "source": [ "T = (1, 2, 2, 3, 3, 4, 4, 4, 4, 5)\n", "print(T.count(4))\n", "print(T.index(1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- list() 와 tuple() 내장 함수를 사용하여 리스트와 튜플을 상호 변환할 수 있음" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[100, 2, 3, 4, 5]\n", "(100, 2, 3, 4, 5)\n" ] } ], "source": [ "T = (1, 2, 3, 4, 5)\n", "L = list(T)\n", "L[0] = 100\n", "print(L)\n", "\n", "T = tuple(L)\n", "print(T)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1-3 튜플의 사용 용도" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 튜플을 사용하는 경우 1: 함수가 하나 이상의 값을 리턴하는 경우" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def calc(a, b):\n", " return a+b, a*b\n", "\n", "x, y = calc(5, 4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 튜플을 사용하는 경우 2: 문자열 포멧팅" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "id : gslee, name : GangSeong\n" ] } ], "source": [ "print('id : %s, name : %s' % ('gslee', 'GangSeong'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 튜플을 사용하는 경우 3: 고정된 값을 쌍으로 표현하는 경우" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_items([('one', 1), ('two', 2)])\n" ] } ], "source": [ "d = {'one':1, 'two':2}\n", "print(d.items())\n", "\n", "\n", "# [('two', 2), ('one', 1)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "## 2 집합 자료형\n", "***\n", "- set 내장 함수를 사용한 집합 자료 생성 \n", " - 변경 가능(Mutable)한 객체이다.\n", " - 각 원소간에 순서는 없다.\n", " - 각 원소는 중복될 수 없다.\n", " - [note] set은 컨네이너 자료형이지만 시퀀스 자료형은 아니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2-1 집합 자료형 생성" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "{1, 2, 3}\n" ] } ], "source": [ "a = set([1, 2, 3])\n", "print(type(a))\n", "print(a)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "{1, 2, 3}\n" ] } ], "source": [ "b = set((1, 2, 3))\n", "print(type(b))\n", "print(b)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "{'c', 'a', 'b'}\n" ] } ], "source": [ "c = set({'a':1, 'b':2, 'c':3})\n", "print(type(c))\n", "print(c)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "{1, 2, 3}\n" ] } ], "source": [ "d = set({'a':1, 'b':2, 'c':3}.values())\n", "print(type(d))\n", "print(d)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- E-learning에서 언급하지 않았던 집합 만드는 방법 --> 꼭 기억하세요~" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "{1, 2, 3, 4, 5}\n" ] } ], "source": [ "e = {1, 2, 3, 4, 5}\n", "print(type(e))\n", "print(e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- set에는 동일한 자료가 중복해서 저장되지 않는다. 즉 중복이 자동으로 제거됨" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 2, 3}\n", "{1, 2, 3}\n" ] } ], "source": [ "f = {1, 1, 2, 2, 3, 3}\n", "g = set([1, 1, 2, 2, 3, 3])\n", "print(f)\n", "print(g)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- set의 원소로는 변경 불가능(Immutable)한 것만 할당 가능하다." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "set()\n", "{1, 2, 3, 4, 5}\n", "{1, 2, 3, 4}\n", "{'a', 'b', 'c'}\n", "{(4, 5, 6), (1, 2, 3)}\n" ] }, { "ename": "TypeError", "evalue": "unhashable type: 'list'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'abc'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 문자열은 각 문자를 집합 원소로 지닌다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 각 튜플은 원소로 가질 수 있음\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 변경 가능 자료인 리스트는 집합의 원소가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'list'" ] } ], "source": [ "print(set()) # 빈 set 객체 생성\n", "print(set([1, 2, 3, 4, 5])) # 초기 값은 일반적으로 시퀀스 자료형인 리스트를 넣어준다.\n", "print(set([1, 2, 3, 2, 3, 4])) # 중복된 원소는 한 나만 저장됨\n", "print(set('abc')) # 문자열은 각 문자를 집합 원소로 지닌다. \n", "print(set([(1, 2, 3), (4, 5, 6)])) # 각 튜플은 원소로 가질 수 있음 \n", "print(set([[1, 2, 3], [4, 5, 6]])) # 변경 가능 자료인 리스트는 집합의 원소가 될 수 없다." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "unhashable type: 'dict'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\"aaa\"\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\"bbb\"\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 변경 가능 자료인 사전도 집합의 원소가 될 수 없다.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'dict'" ] } ], "source": [ "print(set([{1:\"aaa\"}, {2:\"bbb\"}])) # 변경 가능 자료인 사전도 집합의 원소가 될 수 없다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- set의 기본 연산\n", "\n", "| set 연산 | 동일 연산자 | 내용 |\n", "|---------------------------|-------------|-----------------------------|\n", "| len(s) | | 원소의 개수 |\n", "| x in s | | x가 집합 s의 원소인가? |\n", "| x not in s | | x가 집합 s의 원소가 아닌가? |" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "9\n", "True\n", "True\n" ] } ], "source": [ "A = set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", "\n", "print(len(A)) # 집합의 원소의 수\n", "print(5 in A) # 멤버십 테스트\n", "print(10 not in A) # 멤버십 테스트" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2-2 집합 자료형 메소드" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- set의 주요 메소드\n", " - 다음 연산은 원래 집합은 변경하지 않고 새로운 집합을 반환한다. \n", "\n", "| set 연산 | 동일 연산자 | 내용 |\n", "|---------------------------|-------------|-----------------------------|\n", "| s.issubset(t) | s <= t | s가 t의 부분집합인가? |\n", "| s.issuperset(t) | s >= t | s가 t의 슈퍼집합인가? |\n", "| s.union(t) | s | t | 새로운 s와 t의 합집합 |\n", "| s.intersection(t) | s & t | 새로운 s와 t의 교집합 |\n", "| s.difference(t) | s - t | 새로운 s와 t의 차집합 |\n", "| s.symmetric_difference(t) | s ^ t | 새로운 s와 t의 배타집합 |\n", "| s.copy() | | 집합 s의 shallow 복사 |" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "True\n", "True\n", "True\n", "\n" ] } ], "source": [ "B = set([4, 5, 6, 10, 20, 30])\n", "C = set([10, 20, 30])\n", "\n", "print(C.issubset(B)) # C가 B의 부분집합?\n", "print(C <= B)\n", "print(B.issuperset(C)) # B가 C를 포함하는 집합?\n", "print(B >= C)\n", "print()" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30}\n", "{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30}\n", "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n" ] } ], "source": [ "A = set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", "B = set([4, 5, 6, 10, 20, 30])\n", "\n", "print(A.union(B)) # A와 B의 합집합\n", "print(A | B)\n", "print(A)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{4, 5, 6}\n", "{4, 5, 6}\n", "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n" ] } ], "source": [ "print(A.intersection(B)) # A와 B의 교집합\n", "print(A & B)\n", "print(A)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 2, 3, 7, 8, 9}\n", "{1, 2, 3, 7, 8, 9}\n", "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n" ] } ], "source": [ "print(A.difference(B)) # A - B (차집합)\n", "print(A - B)\n", "print(A)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 2, 3, 7, 8, 9, 10, 20, 30}\n", "{1, 2, 3, 7, 8, 9, 10, 20, 30}\n", "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n" ] } ], "source": [ "print(A.symmetric_difference(B)) # 베타집합. A와 B의 합집합에서 교집합의 원소를 제외한 집합\n", "print(A ^ B)\n", "print(A)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 2, 3, 4, 5, 6, 7, 8, 9}\n", "\n", "True\n", "False\n" ] } ], "source": [ "A = set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", "D = A.copy()\n", "print(D)\n", "print()\n", "\n", "print(A == D) #자료값 비교\n", "print(A is D) #객체 동등성 비교" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- set은 시퀀스 자료형이 아니므로 인덱싱, 슬라이싱, 정렬 등을 지원하지 않는다. " ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "'set' object does not support indexing", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mA\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m7\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m8\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m9\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'set' object does not support indexing" ] } ], "source": [ "A = set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", "print(A[0])" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "'set' object is not subscriptable", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mA\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'set' object is not subscriptable" ] } ], "source": [ "print(A[1:4])" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "ename": "AttributeError", "evalue": "'set' object has no attribute 'sort'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m: 'set' object has no attribute 'sort'" ] } ], "source": [ "print(A.sort())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 집합을 리스트나 튜플로 변경가능\n", " - 집합에 인덱싱, 슬라이싱, 정렬 등을 적용하기 위해서는 리스트나 튜플로 변경한다." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 2, 3, 4, 5, 6, 7, 8, 9]\n", "(1, 2, 3, 4, 5, 6, 7, 8, 9)\n" ] } ], "source": [ "print(list(A))\n", "print(tuple(A))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 하지만 집합에 for ~ in 연산은 적용 가능하다." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 2 3 4 5 6 7 8 9 " ] } ], "source": [ "A = set([1, 2, 3, 4, 5, 6, 7, 8, 9])\n", "for ele in A:\n", " print(ele,end=\" \")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- set은 변경 가능(Mutable)한 자료 구조 객체 \n", "- 다음 메소드들은 set을 변경하는 집합 자료 구조 메소드들임\n", "\n", "| set 연산 | 동일 연산자 | 내용 |\n", "|---------------------------|-------------|-----------------------------|\n", "| s.update(t) | s |= t | s와 t의 합집합을 s에 저장 |\n", "| s.intersection_update(t) | s &= t | s와 t의 교집합을 s에 저장 |\n", "| s.difference_update(t) | s -= t | s와 t의 차집합을 s에 저장 |\n", "| s.symmetric_difference_update(t)| s ^= t | s와 t의 배타집합을 s에 저장 |\n", "| s.add(x) | | 원소 x를 집합 s에 추가 |\n", "| s.remove(x) | | 원소 x를 집합 s에서 제거, 원소 x가 집합 s에 없으면 예외 발생 |\n", "| s.discard(x) | | 원소 x를 집합 s에서 제거 |\n", "| s.pop() | | 임의의 원소를 집합 s에서 제거, 집합 s가 공집합이면 예외 발생 |\n", "| s.clear() | | 집합 s의 모든 원소 제거 |" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 2, 3, 4, 5, 6}\n" ] } ], "source": [ "A = set([1, 2, 3, 4])\n", "B = set([3, 4, 5, 6])\n", "\n", "A.update(B) # A에 B 집합의 원소를 추가 시킴\n", "print(A)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{4, 5, 6}\n" ] } ], "source": [ "A.intersection_update([4,5,6,7,8]) # &=\n", "print(A)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{4, 5}\n" ] } ], "source": [ "A.difference_update([6,7,8]) # -=\n", "print(A)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{4, 6, 7}\n" ] } ], "source": [ "A.symmetric_difference_update([5,6,7]) # ^=\n", "print(A)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{4, 6, 7, 8}\n" ] } ], "source": [ "A.add(8) # 원소 추가\n", "print(A)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{4, 6, 7}\n" ] } ], "source": [ "A.remove(8) # 원소 제거\n", "print(A)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "scrolled": true }, "outputs": [ { "ename": "KeyError", "evalue": "10", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 없는 원소를 제거하면 KeyError 발생\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mKeyError\u001b[0m: 10" ] } ], "source": [ "A.remove(10) # 없는 원소를 제거하면 KeyError 발생" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{4, 7}\n" ] } ], "source": [ "A.discard(10) # remove와 같으나 예외가 발생하지 않음\n", "A.discard(6) # 원소 6제거\n", "print(A)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{7}\n" ] } ], "source": [ "A.pop() # 임의의 원소 하나 꺼내기\n", "print(A)" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "set()\n" ] } ], "source": [ "A = set([1,2,3,4])\n", "A.clear() # 모든 원소 없애기\n", "print(A)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 1 }