본문 바로가기

파이썬

[ 코랩과 파이썬 ] 3. python 컨테이너 container 자료: list, tuple, set, dictionary

반응형

1) 파이썬 컨테이너 자료 유형

컨테이너(container) 자료는 스칼라(scalar) 자료를 여러 개 담고 있는 것을 의미한다. 파이썬에서 사용하는 컨테이너 자료는 고유한 특성에 따라 4가지로 구분된다.

  • 리스트(list) : 순서와 중복을 허용하는 값들의 모임으로 문자, 숫자 등 다양한 형태의 값을 가질 수 있음(ex. [’a’, ‘a’, ‘c’], [1, 2, 2], [1, ‘a’, 3])
  • 튜플(tuple): 리스트와 같은 역할을 하지만 객체(object)를 수정할 수 없음(ex. (’a’, ‘a’, ‘c’), (1, 2, 2), (1, ‘a’, 3))
  • 집합(set): 순서와 중복을 허용하는 않는 값들의 모임(ex. {’a’, ‘c’}, {1, 2}, {1, ‘a’, 3})
  • 딕셔너리(dictionary): 순서는 의미가 없지만 중복 값을 키(key) 값을 부여해 구별(ex. {1: 'a', 2: 'a', 3: 'c'}, {’one’: 1, ‘two’:2, ‘three’: 2}, {1: 1, 2: ‘a’, 3: 3})

 

(1) 리스트(list)

 

리스트는 순서를 가지고 중복을 허용하는 객체의 집합으로 하나의 변수에 여러 값을 할당할 수 있다. 리스트는 [ ]을 이용해 생한다. 숫자, 문자, 불리언 모두 가능하며, [숫자, 문자, 불리언] 등 이렇게 혼합해서도 생성할 수 있다. 또한 리스트 안에 리스트를 삽입해 2차원 리스트([1, 2, [’a’, ‘b’], 3]을 만들 수도 있다. 

 

l_1 = []                                    # 객체가 없는 빈 리스트 생성
l_2 = [1, 2, 3]                             # 숫자형 리스트 생성
l_3 = ["one", "two", "three"]               # 문자형 리스트 생성
l_4 = [1, 'one', '2', 'two', 3, 'three']    # 숫자와 문자형 리스트 생성
l_5 = [1,2,3, ['one', 'two', 'three']])     # 2차원 리스트 생성

 

리스트 관련 메서드

 

메서드(method)는 변수명 다음에 '.'를 찍어서 특수한 기능을 수행하는 함수이다. 다음은 리스트 자료 유형과 함께 사용할 수 있는 메서드 종류이다. 리스트가 파이썬에서는 가장 빈번히 사용하는 자료이기 때문에 주요 메서드는 숙지할 필요가 있다.

  • index: 리스트의 객체 순서(첫 번째는 0)
  • append: 리스트의 맨 끝 인덱스에 새로운 값을 추가
  • insert: 리스트의 특정 위치에 값을 추가
  • remove: 리스트 요소 제거(객체명)
  • pop: 리스트의 요소 방출(인텍스), 인텍스를 지정하지 않으면 마지막 요소 방출
  • del: 리스트의 요소 제거 연산(인텍스)
  • sort: 정렬
  • reverse: 순서 뒤집기
  • extend: 새로운 리스트를 기존 리스트에 추가
  • clear: 모두 지우기

간단한 예제를 통해서 리스트 메서드 사용법을 익혀 보도록 하자. 이번 월드컵에 ‘손흥민’, ‘이강인’, ‘조규성’, ‘황희찬’ 선수를 명단에 순서별로 추가했다고 가정하고 이를 리스트로 만들어 보자.

 

worldcup = [‘손흥민’, ‘이강인’, ‘조규성’, ‘황희찬’ ]

 

월드컵 멤버 중 ‘이강인’이 몇 번째로 가입했나 확인하고, 며칠 후 ‘황의조’ 선수가 추가로 멤버에 포함되었으며, ‘황의찬’ 선수가 부상으로 멤버에서 탈락되었다. 

 

# '이강인'은 몇 번째로 월드컵 멤버에 포함되었나?
worldcup.index("이강인")    # index: 리스트 요소의 인덱스 값(위치)을 반환


# '황의조'가 새롭게 월드컵 멤버에 합류함.
worldcup.append("황의조")   # append: 맨 뒤에 리스트 요소 추가


# '황희찬'가 월드컵 멤버에서 제외
worldcup.remove("황희찬")

 

‘황의찬’ 선수가 부상이 완치돼 다시 4번째 위치에 다시 위치시켰는데 이번에는 ‘손흥민’ 선수가 부상이어서 ‘손흥민’을 뽑기로 내보낸다. 그 대신에 [’황인범’, ‘이재성’] 두 선수가 동시에 추가되었다.

 

# '황의찬'이 다시 합류해 원래 순서인 네 번째 위치(index = 3)에 추가(파이썬에서 첫 번째 위치는 index=0 임)
worldcup.insert(3, "황의찬") # insert: 리스트의 특정 위치에 추가

# '손흥민' 뽑아서 멤버에서 제외.
worldcup.pop(0)) # pop(index 지정): 특정 위치에 있는 요소 방출

# 새로운 멤버들 '황인범'과 '이재성'이 동시에 합류함. 
worldcup.extend(["황인범", "이재성"]) # extend: 리스트 확장

 

가장 늦게 들어온 순서대로 정렬해보고, 이름순(알파벳)으로도 정렬해 보자. 그리고 월드컵이 끝나서 팀을 해체하도록 하자.

 

# 가장 늦게 들어온 순서대로 정렬
worldcup.reverse()           # reverse: 리스트 요소 반전

# 이름(알파벳) 순서별로 정렬
worldcup.sort()               # sort: 리스트 요소를 알파벳이나 크기 순으로 정렬

# 월드컵 팀을 해체함.
worldcup.clear()               # clear: 모든 리스트 요소 지우기

 

(2) 튜플(tuple)

 

튜플은 리스트와 유사하지만 포함된 값을 변경할 수가 없다. 따라서 개인 정보 등 수정을 방지하기 위한 자료를 생성할 때 주로 사용된다. 튜플은 ( )을 이용해서 만든다. 

멤버가 바뀌지 않을 염원을 담아 BTS를 튜플로 생성해 보자.

 

bts = ("RM", "진", "슈가", "제이홈", "지민", "뷔", "정국" )

 

bts 멤버에 '영탁'을 추가하려고 하면, “tuple' object has no attribute 'add’”라고 튜플은 속성을 추가할 수 없다는 에러가 발생한다.

 

bts.add("영탁") # 에러가 뜸, 튜플은 데이터 수정이 불가
------------------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Input In [3], in <cell line: 1>()
----> 1 bts.add("영탁")

AttributeError: 'tuple' object has no attribute 'add

 

변수(속성)와 매칭하는  방법으로도 튜플을 생성할 수 있다.

 

(name, nation, id_num) = ("손흥민", "korea", "19920708")

 

 

 (3) 집합(set)

 

집합(set) 자료 유형은 중복을 허용하지 않고 순서도 없는 수학 시간에 배운 집합과 같은 개념이다. 집합은 집합 기호 { }를 이용해 생성한다.

 

s = {1,1,2,2,3,3,3} # 중복값을 허용 안하기 때문에 s에는 {1, 2, 3} 이 할당된다.

 

집합 관련 메서드(method)

 

리스트처럼 집합도 객체들을 추가, 삭제 등 수정할 수 있기 때문에 메서들이 존재한다. 집합 메서드는 자주 사용하지는 않기 때문에 종류만 알고 넘어가도록 하자.

 

  • add(): 요소 추가
  • update(): 여러 요소 추가
  • remove(): 요소 제거
  • discard(): 요소 제거
  • clear(): 모든 요소 제거
worldcup = {‘손흥민’, ‘이강인’, ‘조규성’, ‘황희찬’}

# add() : 멤버에 '황의조' 추가 객체 추가
worldcup.add('황의조')

# update: 여러 객체 추가 - 새로운 멤버들 '황인범'과 '이재성'이 동시에 합류함. 
worldcup.update(['황인범', '이재성']) 

# remove: 객체 제거: '황희찬' 부상으로 제외
worldcup.remove('황희찬')  # remove 대산 discard를 써도 같음

# 모든 데이터 삭제
 worldcup.clear()

 

 

(4) 딕셔너리(dictionary)

 

딕셔너리(dictionary) 자료 형태는 고유 구분자인 키(key)와 해당 키에 종속된 값(value)으로 구성된다. 마치 '단어(key): 뜻(value)' 형태로 사전과 유사한 형식을 가지고 있어서 '딕셔너리' 확인 '사전'이라고 부른다. 집합 기호 { }를 사용하여 {key1: value1, key2: value2, key3: value3, ......}의 형태로 자료를 생성한다.

 

dic_1 = {1:'one', 2:'two', 3:'three', 4:'four'}

 

딕셔너리(dictionary) 자료는 키(key)와 키에 해당하는 값(value)이 한 쌍을 이룬다. 그래서 키(key)를 활용해 값(value)을 찾거나, 값을 이용해 키를 찾거나 변경할 수 있다. 사물함이 키 번호와 이용자로 구성되어 있기 때문에 이를 이용하면 딕셔너리 데이터를 더욱 쉽게 이해할 수 있다. 

우선 월드컵 멤버인 ‘손흥민’과 ‘이강인’에게 1번과 10번 라커룸을 배정하였다.

 

# keys: 1, 10     values: "손흥민", "이강인" 
 locker = {1:"손흥민", 10:"이강인"} # '손흥민 1번, 이강인 10번 배정

 

 

딕셔너리 관련 메서드(method)

 

딕셔너리 자료도 리스트나 집합처럼 객체를 수정할 수 있기 때문에 이를 위한 메서드가 존재한다. 새로운 값을 추가할 때 리스트 자료는 append(), 집합은 add() 메서드를 사용하였다. 딕셔너리 자료의 경우 키와 값을 동시에 입력해야 하므로 메서드를 사용하지 않고 인덱스([ ])를 사용한다. 인덱스는 객체의 위치를 나타내는 것으로 인덱싱과 슬라이싱 부분에서 자세히 설명할 것이다. 

딕셔너리 자료에 새로운 키와 값을 넣으면 인덱스 안에 키를 주고 값을 그곳에 저장하면 된다.

 

# 조규성 선수를 5번 locker에 배정하려고 한다면,
 locker[5] = '조규성'    # {1: '손흥민', 10: '이강인', 5: '조규성'} 배정

 

키를 삭제하면 당연히 값도 같이 삭제된다. 라커룸 1을 빼도록 하자.

 

# del 명령문
del locker[1]    # 키 1 삭제: '손흥민' 라커룸 삭제


# pop(): key에 해당하는 value 값 방출, 이강인을 뽑아서 방출시킴
locker.pop(10)   # 키 10 삭제: '이강인' 팝업되었고, locker에는 {5: '조규성'}만 남음.

 

딕션너리 자료에서 가장 자주 사용되는 메서드는 keys(), values(), items() 이다. 특히 나중에 배울 반복문에서 딕셔너리 데이터를 다룰 때 키나 값을 뽑아와야 하는데 그때 사용되기 때문에 반드시 숙지하고 있어야 한다.

 

  • keys(): 키만 출력
  • values(): 값만 출력
  • items(): 기와 값을 쌍으로 출력
locker.keys()   # 현재 locker에 남아 있는 key인 dict_keys([5])를 출력

locker.values() # 현재 locker에 남아 있는 value인 dict_values(['조규성'])을 출력

locker.items()  # 현재 locker에 남아 있는 key와 value 인 dict_items([(5, '조규성'))을 출력


# 라커룸 모두 비움
locker.clear()

 

 

2) 컨테이너 자료 변환

 

리스트, 튜플, 집합, 딕셔너리를 각자 특수한 성격을 가지고 있다. 리스트 자료를 수정하지 못하도록 하려면 튜플로 변환하면 되고, 중복을 제거하려면 집합으로 바꾸면 된다. 각 자료 간 변환 방법에 대해 살펴보도록 하자. 

 

리스트는 list(), 튜플은 tuple(), 집합은 set(), 딕셔너리는 dict() 함수를 이용해 쉽게 변환할 수 있다. 하지만 딕셔너리 데이터의 경우 키와 값이 있어야 하므로 리스트, 튜플, 집합을 직접 딕셔너리 자료로 변경할 수는 없다

 

# 리스트 자료형으로 변환: list()
list('Son')                      # 문자열을 리스트로 변환하면 알파벳 하나가 객체로 전환 ['S', 'o', 'n'] 
list((1,2,3))                     # 튜플 (1, 2, 3)을 리스트 [1, 2, 3] 으로 변환
list({1,2,3})                    # 집합 {1, 2, 3}을 리스트 [1, 2, 3]으로 변환
list({1: 'a',2: 'b',3: 'c'})     # 딕셔너리 자료의 경우 key가 리스트 [1, 2, 3]으로 변환


# 튜플 자료형으로 변환: tuple()
tuple('Son')                      # 문자열을 튜플로 변환하면 알파벳 하나가 객체로 전환 ('S', 'o', 'n')
tuple((1,2,3)                     # 리스트 [1, 2, 3]을 튜플 (1, 2, 3) 으로 변환
tuple({1,2,3})                    # 집합 {1, 2, 3}을 튜플 (1, 2, 3)으로 변환
tuple({1: 'a',2: 'b',3: 'c'})     # 딕셔너리 자료의 경우 key가 튜플 (1, 2, 3)으로 변환


# 집합 자료형으로 변환: set()
set('Son')                      # 문자열 집합으로 변환하면 알파벳 하나가 객체로 전환 {'S', 'o', 'n'}
set([1,2,3])                    # 리스트 [1, 2, 3]을 집합 {1, 2, 3} 으로 변환
set((1,2,3))                    # 튜플 (1, 2, 3)을 집합 {1, 2, 3}으로 변환
set({1: 'a',2: 'b',3: 'c'})     # 딕셔너리 자료의 경우 key가 집합 {1, 2, 3}으로 변환
반응형