콘텐츠로 이동

군집 자료형 2 - 튜플, 집합, 사전

1. 튜플

튜플(tuple) 사용하기

튜플(tuple) 이란?

  • 값의 나열이며, 순서가 존재한다.
  • 하나의 튜플안에 여러종류(자료형)의 값을 담을 수 있다.
  • 0부터 시작하는 정방향 인덱스, -1부터 시작하는 역방향 인덱스가 있으며, 슬라이싱도 가능하다.
  • 읽기 전용이다. (항목을 변경할 수 없는 불변 객체이다)

튜플은소괄호(( ))를사용하여정의내린다.

myTuple = ( )
myTuple = (1, "python", 3.14)
myTuple = ("Software",)
myTuple = 1, 2, "number"
  • 값이 없는 빈 튜플을 만들 때는 빈 괄호나 인수가 없는 tuple()함수를 사용한다.
  • 튜플을 정의 내릴 때 소괄호 사용은 생략할 수 있다.
  • 튜플을 정의 내릴 때 괄호 안에 하나의 항목만 넣으면 튜플로 인정하지 않는다.
  • 튜플을 할당받는 변수를 '튜플 변수'라고 한다.
#section_032.py
myTuple = ()
myTuple = (1, 2, 3)
myTuple = (1, "python", 3.14)
myTuple = ("문자열도 넣고", (1, 2, 3), [4, 5, 6])

myTuple = 1, 2, "number"
print(myTuple)
a, b, c = myTuple
print(a, b, c)
print()

# 튜플 선언시 한가지 유의점
myTuple = "Hello"
print(type(myTuple)) # myTuple는 문자열 변수

myTuple = ("Hello", )
print(type(myTuple)) # myTuple는 튜플 변수

myTuple = (1, 2, 3)
# myTuple[0] = 10  # 오류 발생

Output

(1, 2, 'number')
1 2 number

<class 'str'>
<class 'tuple'>

튜플의 인덱싱과 슬라이싱

튜플의 인덱싱과 슬라이싱 방법은 문자열, 리스트와 동일하다.

#section_033.py

# 인덱싱
myTuple = ('a', 'b', 'c')
print(myTuple[0])
# print(myTuple[3])     # 오류발생 - 튜플의 벗어난 인덱싱은 지원하지 않는다.
# print(myTuple[2.0])   # 오류발생 - 인덱싱은 반드시 정수로 지정해야 한다.
print()

myTuple = ("tuple", (1, 2, 3), [4, 5, 6])
print(myTuple[0])
print(myTuple[0][1])
print(myTuple[2][0])
print(myTuple[-1])
print(myTuple[-1][0])
print()

# 슬라이싱
myTuple = ('p', 'y', 't', 'h', 'o', 'n')
print(myTuple[1:4])
print(myTuple[ :-2])
print(myTuple[ : ])

Output

a

tuple
u
4
[4, 5, 6]
4

('y', 't', 'h')
('p', 'y', 't', 'h')
('p', 'y', 't', 'h', 'o', 'n')

불변 객체 튜플이 가변 객체를 가지면

  • 불변 객체인 튜플이 가변 객체인 리스트를 항목으로 가지고 있을 땐 리스트 항목 전체를 다른 자료형으로 바꾸는 것은 불가능하지만, 가변 객체인 리스트 내 포함되어 있는 각 항목은 수정할 수 있다.
    myTuple = (1, 2, [10, 20, 30]) 
    myTuple[0] = 5 # 오류 발생 
    myTuple[2] = 0 # 오류 발생 
    myTuple[2][1] = 5 # 오류 발생 않함
    
  • 튜플이 불변 객체라는 의미는 튜플의 항목을 수정할 수 없다는 의미일 뿐 튜플 변수에 새로운 값을 저장할 수 없다는 의미는 아니다.
  • 튜플은 불변 객체라서 처리 속도가 빠르고 내용의 일관성에 대한 믿음이 있다.
#section_034.py

myTuple = (1, 2, [10, 20, 30])
print(myTuple)
# myTyple[0] = 5 # 오류발생
# myTyple[2] = 9 # 오류발생

myTuple[2][1] = 5
print(myTuple)

myTuple = ('p', 'y', 't', 'h', 'o', 'n')
print(myTuple)

Output

(1, 2, [10, 20, 30])
(1, 2, [10, 5, 30])
('p', 'y', 't', 'h', 'o', 'n')

튜플의 연산과 관련 메서드

튜플의 연산

  • 두 개의 튜플을 연결하려면 + 연산자를 사용한다.
  • 튜플을 반복하려면 * 연산자를 사용한다.
  • 어떤 값이 튜플에 존재하는지 여부를 확인 하고자 할 때는 in 또는 not in 연산자를 사용한다.
  • 튜플을 삭제하고자 할 때는 del 명령을 사용한다.
  • 튜플 관련 메서드
    • count() 메서드는 괄호 안의 항목이 튜플에 몇 개 존재하는지 알려준다.
    • index() 메서드는 괄호 안의 항목이 처음 발견된 위치를 알려준다.
메서드 내용 리턴값
tuple변수.count(obj) 튜플에서 obj 객체가 몇 개 있는 지 알려준다. obj 객체의 개수를 리턴
tuple변수.index(obj) 튜플에서 obj 객체가 위치한 가장 첫 번째 인덱스 값을 리턴한다. 인덱스 값 리턴,
값이 없으면 오류 발생
# section_035.py

myTuple = (1, 2, 3)
yourTuple = (4, 5, 6)

# 튜플연산
ourTuple = myTuple + yourTuple
print(ourTuple) 

multiflyTuple = myTuple * 3

# del ourTuple
# print(ourTuple)

# 튜플 멤버십 테스트
print(1 in myTuple)
print(4 in myTuple)
print(3 not in myTuple)

# 튜플관련 메서드
print(multiflyTuple.count(1))
print(multiflyTuple.index(2))

Output

(1, 2, 3, 4, 5, 6)
True
False
False
3
1

튜플 관련 내장 함수

  • 튜플도 내장 함수와 함께 사용하면 코딩이 편리해 진다.
  • sorted() 함수는 원본 튜플을 변경하지 않고 정렬된 새로운 리스트를 만들어 반환한다.
    • sorted() 함수로 인해 생겨나는 것은 튜플이 아니라 리스트이다
  • tuple()함수는 다른 종류의 시퀀스형 객체를 리스트로 만들어 준다.
함수 설명 리턴값
len() 튜플에 들어가있는 항목의 개수를 리턴한다. 항목의 개수
max() 튜플에 들어있는 항목 최대값을 리턴한다. 항목중 최대값
min() 튜플에 들어있는 항목 최소값을 리턴한다. 항목중 최소값
sum() 튜플에 들어있는 항목들의 합을 리턴한다. 항목들의 합
sorted() 튜플에 들어있는 항목들을 오름차순으로 정렬한다. 정렬된 새로운 리스트
tuple(seq) 괄호 안에 지정한 시퀀스형 객체를 튜플로 만들어 준다. 튜플

Warning

max(), min(), sum() 은 항목의 자료형이 문자열일 경우에는 사용할 수 없다.

#section_036.py

t_float = (120.09, 9.11, 2.8)
L_int = [1, 2, 3]

print(len(t_float))
print(max(t_float))
print(min(t_float))
print(sum(t_float))
print(sorted(t_float))
print(t_float)

print(tuple(L_int))

Output

3
120.09
2.8
132.0
[2.8, 9.11, 120.09]
(120.09, 9.11, 2.8)
(1, 2, 3)

2. 집합

집합(set) 사용하기

집합(set)

  • 우리가 수학에서 배웠던 집합이랑 같은 개념
  • 집합은 '중복이 없다'와 '순서가 없다'는 특징이 있다.

집합은 중괄호({ })를 사용하여 정의 내린다.

my_set = {1, 2, 3}
my_set = {"Hello", 1.0, (1,2,3)}
  • 집합도 리스트나 튜플처럼 다양한 자료형을 담을 수 있으나 리스트 같은 가변 객체는 집합의 항목이 될 수 없다.
  • 집합은 순서가 없기 때문에 인덱스를 이용해 각 항목에 접근하는 인덱싱을 할 수 없다.
  • 빈 집합을 만들때는 반드시 set()함수를 사용해야 한다.
    my_set = { } # 사전형으로 만들어 진다 
    my_set = set() # 빈 집합이 만들어 진다
    
#section_037.py

my_set = {1, 2, 3}
print(my_set)
print(type(my_set))

my_set = {"Hello", 1.0, (1, 2, 3)}
print(my_set)
#my_set = {1, 2, [4, 5]} # 오류 발생

my_set = {1, 2, 3, 3, 4, 2}
print(my_set)

# print(my_set[0]) # 오류 발생

# 빈 집합을 만들 때 주의 할 점 
my_set = {}
print(type(my_set))
my_set = set()
print(type(my_set))

Output

{1, 2, 3}
<class 'set'>
{1.0, (1, 2, 3), 'Hello'}
{1, 2, 3, 4}
<class 'dict'> <class 'set'>

집합 관련 메서드 1 - 항목 추가하고 가져오기

  • 집합은 값을 추가하고 가져오기 위해 아래와 같은 메서드를 제공하고 있다.
    • add(): 집합에 한 개의 항목을 추가
    • update(): 집합에 여러개의 항목들을 추가. 집합은 중복을 알아서 제거
    • pop(): 집합에서 임의의 항목하나를 가져옴. 추출된 항목은 기존 집합에서 삭제됨
  • 집합은 순서가 없기 때문에 값을 추가해도 어디에 배치될지 알 수 없다.
  • 집합은 순서가 없기 때문에 값을 추출할 때 어떤 값이 나올지 알 수 없다.
메서드 설명 리턴값
set변수.add(obj) 집합에 obj 객체를 추가한다. 리턴값은 없고 집합만 갱신
set변수.update(obj1,obj2) 집합에 여러 객체를 추가한다. 리턴값은 없고 집합만 갱신
set변수.pop(obj) 집합에서 임의의 한 항목을 리턴하고 집합에서 삭제한다. 삭제된 항목을 리턴
#section_038.py

s_nature = {'sky', 'sea'}
print(s_nature)
print()

# 항목 추가하기
s_nature.add('earth')
print(s_nature)
s_nature.update({1, 2}, [2, 3])
print(s_nature)
print()

# 항목 가져오기
print(s_nature.pop())
print(s_nature)
print(s_nature.pop())

Output

{'sea', 'sky'}

{'sea', 'earth', 'sky'}
{1, 'earth', 2, 3, 'sea', 'sky'}

1
{'earth', 2, 3, 'sea', 'sky'}
earth

집합 관련 메서드 2 - 항목 삭제하기

집합은 값을 삭제하기 위해 아래와 같은 메서드를 제공하고 있다.

  • discard(): 삭제할 때 삭제하려는 객체가 집합에 없어도 오류를 발생시키지 않음
  • remove(): 삭제할 때 삭제하려는 객체가 집합에 없으면 오류를 발생시킴
  • clear(): 집합의 모든 항목을 삭제시키고 빈 집합을 만듦
메서드 설명 리턴값
set변수.discard(obj) 집합에 obj 객체를 삭제한다.
삭제하려는 객체가 집합에 없어도 오류를 발생시키지 않는다.
리턴값은 없고
집합만 갱신
set변수.remove(obj) 집합에 obj 객체를 삭제한다.
삭제하려는 객체가 집합에 없으면 오류를 발생시킨다.
리턴값은 없고
집합만 갱신
set변수.clear() 집합에서 모든 항목을 삭제시켜 빈집합으로 만든다. 리턴값은 없고
집합을 빈집합으로 갱신
#section_039.py

s_planet = {'수성', '금성', '지구', '화성', '목성', '토성', '천왕성', '혜왕성'}

print(s_planet)
print()

# 항목 삭제하기
s_planet.discard('금성')
print(s_planet)
s_planet.remove('천왕성')
print(s_planet)
#s_planet.remove('명왕성') # 오류 발생
print()

# 항목 비우기
s_planet.clear()
print(s_planet)

Output

{'수성', '목성', '천왕성', '혜왕성', '화성', '토성', '금성', '지구'}

{'수성', '목성', '천왕성', '혜왕성', '화성', '토성', '지구'}
{'수성', '목성', '혜왕성', '화성', '토성', '지구'}

set()

집합 관련 메서드 3 - 집합 연산하기

  • 파이썬의 집합은 수학의 집합과 똑같은 연산을 제공해 준다.
  • 집합 연산과 관련된 연산자와 메서드가 함께 있다.
  • 집합 연산을 해도 원본 집합은 변하지 않고 새로운 집합을 생성해 준다.
메서드 연산자 설명 리턴값
set변수.union(set) 집합과 set 집합의 합집합을 구한다. 합집합을 리턴함
set변수.intersection(set) & 집합과 set 집합의 교집합을 구한다. 교집합을 리턴함
set변수.difference(set) - 집합과 set 집합의 차집합을 구한다. 차집합을 리턴함
set변수.symmetric_difference(set) ^ 집합과 set 집합의 대칭차집합을 구한다. 대칭 차집합을 리턴함
set변수.issubset(set) <= 집합이 set 집합의 부분집합인지 알려준다. 부분집합이면 True, 아니면 False를 리턴함
set변수.issuperset(set) >= 집합이 set 집합을 포함하는지 알려준다. 포함하면 True, 아니면 False를 리턴함
#section_040.py

A = {1, 2, 3, 4, 5, 6}
B = {1, 2, 3, 7, 8, 9}

# 합집합
print(A | B, '-> A | B')
print(A.union(B), '-> A.union(B)')
print(B.union(A), '-> B.union(A)')
print(A, '-> A')
print()

# 교집합
print(A & B, '-> A & B')
print(A.intersection(B), '-> A.intersection(B)')
print()

# 차집합
print(A - B, '-> A - B')
print(A.difference(B), '-> A.difference(B)')
print()

# 대칭 차집합
print(A ^ B, '-> A ^ B')
print(A.symmetric_difference(B), '-> A.symmetric_difference(B)')
print()

# 부분집합
print({4, 5, 6} <= A)
print({4, 5, 6}.issubset(A))
print({1, 2, 3, 4, 5, 6} >= A)
print({1, 2, 3, 4, 5, 6}.issuperset(A))

Output

{1, 2, 3, 4, 5, 6, 7, 8, 9} -> A | B
{1, 2, 3, 4, 5, 6, 7, 8, 9} -> A.union(B)
{1, 2, 3, 4, 5, 6, 7, 8, 9} -> B.union(A)
{1, 2, 3, 4, 5, 6} -> A

{1, 2, 3} -> A & B
{1, 2, 3} -> A.intersection(B)

{4, 5, 6} -> A - B
{4, 5, 6} -> A.difference(B)

{4, 5, 6, 7, 8, 9} -> A ^ B
{4, 5, 6, 7, 8, 9} -> A.symmetric_difference(B)

True
True
True
True

집합 관련 연산과 내장 함수

  • in 연산자는 해당 값이 집합에 있는지를 확인하며, not in 연산자는 반대로 해당 값이 집합에 없는지를 확인하여 결과를 True 또는 False로 반환한다.
  • sorted() 함수는 원본 집합을 변경하지 않고 정렬된 새로운 리스트를 만들어 반환한다.
    • sorted()함수로 인해 생겨나는 것은 집합이 아니라 리스트이다
  • set()함수는 다른 종류의 객체를 집합으로 만들어 준다. 이때 집합으로 바뀌면서 중복된 값들은 제거된다.
함수 설명 리턴값
len() 집합에 들어있는 항목의 개수를 리턴한다. 항목의 개수
max() 집합에 들어있는 항목 최대값을 리턴한다. 항목중 최대값
min() 집합에 들어있는 항목 최소값을 리턴한다. 항목중 최소값
sum() 집합에 들어있는 항목들의 합을 리턴한다. 항목들의 합
sorted() 집합에 들어있는 항목들을 오름차순으로 정렬한다. 정렬된 새로운 리스트
set(obj) 괄호 안의 객체를 집합로 만들어 준다. 집합
#section_041.py

s_float = {1.0, 3.0, 2.0, 10.0}
print(s_float)
print()

print(0.0 in s_float)
print('a' not in s_float)
print()

print(len(s_float))
print(max(s_float))
print(min(s_float))
print(sum(s_float))
print(sorted(s_float))
print(s_float)

print(set([1, 2, 3, 2, 3]))

Output

{3.0, 1.0, 10.0, 2.0}

False
True

4
10.0
1.0
16.0
[1.0, 2.0, 3.0, 10.0]
{3.0, 1.0, 10.0, 2.0}

3. 사전

사전(dictionary) 사용하기

사전(dictionary)란?

  • 키와 값의 쌍으로 구성 되어있는 자료형으로 키를 이용해서 값을 가져올 수 있다.
  • 키는 불변 객체여야 하며 절대 중복될 수 없지만, 값은 중복될 수 있다.
  • 사전은 인덱스를 지원하지 않으며, 없는 키를 사용하면 오류가 발생한다.
  • 사전도 집합처럼 중괄호({ })를 사용하여 정의 내리지만, 사전에 포함되는 각 항목은 콜론( : )을 중심으로 키:값 쌍으로 묶어 주고, 항목 간에는 콤마( , )를 사용해서 구분해야 한다.
  • 사전을 만들때 중괄호안을 비워두면 빈 사전이 만들어 진다.
      my_dict = { }
      my_dict = {'fishing': '낚씨질', 'fishing banks': '어초', 'fishing boat': '낚싯배'}
      my_dict = {1: "수소", 2: "헬륨", 2: "리튬", 3: "리튬"}
    
  • 사전을 만들때 키가 중복되면 하나만 남고 나머지 중복된 항목은 사라진다.
  • 내장함수인 dict()를 사용해서 사전을 정의 내릴수도 있다.
#section_042.py

my_dict = {}
my_dict = {'fishing': '낚씨질', 'fishing banks': '어초', 'fishing boat': '낚싯배'}
my_dict = {1: "수소", 2: "헬륨", 2: "리튬", 3: "리튬"}
print(my_dict)

my_dict = {"name": "mr. Kang", 14003: [3, 2, 0, 1] }
my_dict = dict([(1, '서울'), (2, '부산')])
print(my_dict)
print(type(my_dict))

Output

{1: '수소', 2: '리튬', 3: '리튬'}
{1: '서울', 2: '부산'}
<class 'dict'>


사전에서 값 가져오기

  • 사전은 순서가 없기 때문에 키를 이용해 값에 접근한다.
  • 사전에서 값을 가져오는 방법은 키를 직접 이용하는 방법get()메서드를 사용하는 방법이 있다.
    • get( )메서드를 이용하여 사전에 값을 가져올 때, 사전에 존재하지 않는 키가 지정되면 None을 반환받을 뿐 오류가 발생하지 않는다.
    • 키를 직접 이용해서 사전에 값을 가져올 때, 사전에 존재하지 않는 키가 지정되면 `KeyError`` 오류가 발생한다.
  • 사전에 키를 통해 직접 값을 대입하여 수정하려는 경우
    • 사전에 접근하려는 키가 존재하면 기존 값을 새로운 값으로 수정한다.
    • 사전에 접근하려는 키가 존재하지 않으면 새로운 항목(키와 값)으로 추가된다.
# section_043.py
user = {"name": "raim", "age": 8, "job": "초딩"}

print(user['name'])
print(user.get('age'))
print(user.get('birth'))
# print(user['birth']) # 에러발생
print()

user['name'] = '라온' #항목 수정
user['age'] = 6
user['job'] = '유딩'
print(user)

user['birth'] = '2018-04-07' # 항목추가
user['parent'] = 'joe'
print(user)

Output

raim
8
None

{'name': '라온', 'age': 6, 'job': '유딩'}
{'name': '라온', 'age': 6, 'job': '유딩', 'birth': '2018-04-07'}


사전에서 값 삭제하기

사전에서 값을 삭제하는 방법으로는 관련 메서드를 사용하는 방법과 del 문을 사용하는 방법이 있다.

메서드 설명 리턴값
dict변수.pop(key. [default]) 해당 key가 사전에 있으면 대응하는 값을 돌려주고 원본 사전에서 해당 항목을 삭제한다.
만약 사전에 key가 없으면 지정해 둔 default를 리턴함.
이때 default를 지정하지 않았다면 에러가 발생한다.
사전에 키가 있으면 대응하는 값을 리턴.
사전에 키가 없으면 default를 리턴
dict변수.popitem() 사전에서 임의의 항목을 돌려주고 원본 사전에서 해당 항목을 삭제한다. 임의의 항목을 리턴
dict변수.clear() 사전에 모든 항목을 삭제한다. 리턴값은 없고 사전을 빈 사전으로 갱신

Info

del 문을 사용하면 사전 항목 뿐만 아니라 사전 변수 자체도 삭제할 수 있다 .

my idol = {'job': 'singer', 'age':18, 'name': 'joe', 'birth': '1994-10-10'}
print (my_idol)
print ()

print (my idol.pop ('birth')) # 항목 가져오면서삭제하기
print (my_ idol)
print ()

del my_idol ['age']
# 항목삭제하기
print (my idol)
print ()

print (my idol.popitem ())
# 임의의 항목가져오면서삭제하기
print (my idol)
print ()

my idol.clear ()
# 사전비우기
print (my idol)

del my idol
#print (my idol)

Output

{'job': 'singer', 'age': 18, 'name': 'joe', 'birth': '1994-10-10'}

1994-10-10
{'job': 'singer', 'age': 18, 'name': 'joe'}

{'job': 'singer', 'name': 'joe'}
('name', 'joe')
{'job': 'singer'}

{}


사전 관련 메서드

사전의 내용을 받는데 사용할 수 있는 메서드로는 items(), keys(), values()가 있다.

  • 이 세가지 메서드는 반복문과 함께 많이 사용된다.
  • 이 세가지 메서드를 통해 반환받은 값은 리스트나 튜플로 변경하여 사용할 수 있다.
메서드 설명 리턴값
dict변수.items() 사전의 키와 값을 dict_items 형태로 돌려준다. dict_items 형태로 리턴
dict변수.keys() 사전의 키들만 dict_keys 형태로 돌려준다. dict_keys 형태로 리턴
dict변수.values() 사전의 값들만 dict_values 형태로 돌려준다. dict_values 형태로 리턴

Warning

dict_items, dict_keys, dict_values는 사전이 가지고 있는 원본의 상태를 그대로 반영해 주는 사전의 특별한 형식(시퀀스형 객체)이다.

# section 045.py
my_fam = {1: "joe", 2: "euna", 3: "raim", 4: "raon"}
viewItems = my_fam.items()
viewKeys = my_fam. keys()
viewValues = my_fam.values()
print(viewItems)
print(viewKeys)
print(viewValues)
print()

my_fam.pop(4)
print(viewItems)
print(viewKeys)
print(viewValues)
print()

# 원본에 변화를
print(list(my_fam.keys()))
print(list(viewValues))

Output

dict_items([(1, 'joe'), (2, 'euna'), (3, 'raim'), (4, 'raon')])
dict_keys([1, 2, 3, 4])
dict_values(['joe', 'euna', 'raim', 'raon'])

dict_items([(1, 'joe'), (2, 'euna'), (3, 'raim')])
dict_keys([1, 2, 3])
dict_values(['joe', 'euna', 'raim'])

[1, 2, 3]
['joe', 'euna', 'raim']