* 스스로 공부한 내용을 바탕으로 작성한 글입니다. 부정확한 부분이나 오류가 있을 수 있으며, 발견 시 댓글로 알려주세요!
이전 포스팅에서 여러 자료형에 대해 알아보면서 문자열 자료형 및 세트와 딕셔너리에 대해 간단히 살펴보았다. 각 자료형마다의 특징이 뚜렷하고 다양한 연산이 가능하다. 그렇기 때문에 필요한 상황에 맞는 자료형을 골라 쓰기 위해서는 이들에 대해 제대로 이해하는 것이 중요하다. 따라서 리스트, 튜플, 세트, 딕셔너리에 대해 비교, 정리해 보도록 하겠다.
1. 리스트
우리는 변수 하나에는 하나의 값만을 저장할 수 있다. 하지만 여러개의 값을 하나의 변수로 지정하기 위해서는 어떻게 해야 할까? 다양한 방법이 있지만 그중 여러 값을 한 번에 저장하기 위해 가장 자주 사용하는 자료형은 리스트이다. 리스트는 여러 변수들을 [], 즉 대괄호 안에 넣어주고 각 값은 , 콤마를 통해 구분해 준다. 또한 값이 없는 빈 리스트도 두 가지 방식으로 직접 선언해 줄 수 있다. 리스트의 큰 특징 중 하나는 정수와 실수부터 문자열 등의 모든 자료형을 저장할 수 있다는 것이다. 또한 저장되는 자료형들이 여러 가지여도 괜찮다. 또한 리스트는 처음 주어진 값들의 순서 그대로 저장되며, 각 위치를 0부터 시작하는 인덱스를 통해 관리하고 접근할 수 있다.
# 기본 리스트 선언
리스트명 = [값1, 값2, 값3]
# 빈 리스트 선언
빈리스트 = list()
빈리스트2 = []
리스트 연산
리스트 자료형에서 사용할 수 있는 연산은 여러가지가 있다. 가장 간단한 사칙연산으로는 더하기(+)와 곱하기(*) 연산이 있다. 더하기 연산은 리스트를 연결해 주고, 곱하기 연산은 리스트를 반복적으로 출력해 준다. 리스트를 연결하는 것에는 더하기 말고도 extend() 함수를 사용하면 리스트를 연결할 수 있다. 하지만 두 방식에는 큰 차이가 있는데, 단순 더하기(+) 연산은 두 리스트의 원본은 그대로 둔 채 이어진 결과를 출력한다. 하지만 기존리스트.extend(새리스트)의 방식으로 함수를 사용하면 실제로 기존 리스트 자체를 기존리스트+새리스트로 변경한다. 리스트에 append() 함수를 사용하면 새로운 값을 리스트의 마지막에 추가하고, remove() 함수를 사용하면 해당 값을 리스트에서 제거한다. insert() 함수는 원하는 인덱스를 가진 위치에 값을 삽입하고, pop() 함수를 통해서는 추출하고자 하는 값을 리스트에서 뽑아냄과 동시에 해당 값을 반환한다. 또한 sort()와 reverse() 함수를 사용하여 정렬할 수 있다.
# 리스트끼리의 연산
리스트1 = [1, 2, 3]
리스트2 = [4, 5, 6]
리스트1 + 리스트2 # 리스트의 연결. 출력 = [1, 2, 3, 4, 5, 6]
리스트1 * 3 # 리스트를 정수배만큼 반복 연결. 출력 = [1, 2, 3, 1, 2, 3, 1, 2, 3]
리스트1.extend(리스트2) # 리스트의 연결2. 출력 = [1, 2, 3, 4, 5, 6]
# 리스트에 새로운 요소 추가하기 : append() 함수
리스트.append(새값)
# 리스트 새로운 요소 삽입하기 : insert() 함수
리스트.insert(인덱스,새값)
# 리스트가 가진 요소 추출하기 : pop() 함수
리스트.pop(추출할값)
# 리스트가 가진 요소 제거하기 : remove() 함수
리스트.remove(제거할값)
# 리스트에서 해당 값의 갯수를 반환하기 : count() 함수
리스트.count(찾을값)
# 리스트 안의 요소를 찾아서 해당 요소의 위치 반환하기 : index() 함수
리스트.index(찾을값)
# 리스트 순서대로(오름차순) 정렬하기 : sort() 함수
섞인리스트 = [2, 4, 3, 1, 5]
섞인리스트.sort() # 정렬 결과 : [1, 2, 3, 4, 5]
# 리스트 순서대로(내림차순) 정렬하기 : sort(reverse=True) 사용
섞인리스트.sort(reverse=True) # 정렬 결과 : [5, 4, 3, 2, 1]
# 리스트를 반대로 정렬하기 : reverse() 함수
섞인리스트.reverse() # 정렬 결과 : [5, 1, 3, 4, 2]
2. 튜플
튜플도 기능적으로는 리스트와 굉장히 비슷하다. 튜플과 리스트의 가장 큰 차이점은 저장한 값을 변경할 수 있느냐이다. 리스트는 내부 값을 자유롭게 생성하고 추가, 수정, 삭제 모두 가능하지만(mutable), 튜플 내에 한번 저장된 값은 절대 수정이 불가능(immutable)하다. 튜플은 () 소괄호를 통해 정의할 수 있고 내부에 값을 저장하면 된다. 또한 괄호를 넣지 않고 하나의 변수 뒤에 여러가지 값을 나열해도 튜플이 생성된다. 빈 튜플을 만들기 위해서는 단순히 소괄호만 지정해 주면 된다. 한 가지 특이한 점이 있다면, 튜플에서는 값이 한 개 일 때는 반드시 그 값 뒤에 콤마를 붙여주어야 한다. 튜플들도 더하기, 곱하기의 연산은 가능한데, 내부의 요소를 변경할 수 없기 때문에 삽입, 삭제, 변경 등의 동작은 할 수 없다. 하지만 리스트처럼 인덱스를 사용해서 튜플 내부의 값에 접근할 수 있다.
# 기본 튜플 선언
튜플 = (값1, 값2, 값3)
튜플1 = 값1, 값2, 값3
# 빈 튜플 만들기
빈튜플 = ()
# 요소가 하나인 튜플
튜플하나 = (값1, )
# 튜플끼리의 연산
튜플1 = (1, 2)
튜플2 = (3, 4)
튜플1 + 튜플2 # 튜플의 연결. 출력 = (1, 2, 3, 4)
튜플1 * 2 # 튜플을 정수배만큼 반복 연결. 출력 = (1, 2, 1, 2)
3. 세트
파이썬의 세트는 집합과 같은 개념인 자료형이다. 집합이라는 말 자체를 영어에서는 세트라고 부른다고 한다. 세트 자료형을 통해서는 주로 합집합, 교집합, 차집합과 같은 연산을 처리한다. 세트는 {}, 중괄호를 사용하여 정의하고 각 값은 , 콤마를 통해서 구분해준다. 세트는 이전에 보았던 리스트나 튜플과는 다른 점이 뚜렷하게 존재한다. 첫 번째로, 세트 안의 값들은 순서가 지정되어 있지 않다. 이 말은 세트를 출력할 때마다 매번 요소의 순서가 뒤바뀐다(unordered). 그렇기 때문에 리스트나 튜플처럼 인덱스(≒저장된 요소들의 순서)를 사용하여 그 안의 요소를 꺼낼 수 없다. 그렇기 때문에, 세트 안에 특정한 값이 있는지를 확인하기 위해서는 in을 사용한다. '값 in 세트'의 조건문을 사용하면 해당 값이 있는지 확인할 수 있다.
두 번째로 세트는 중복된 값을 저장하지 않는다는 것이다. 따라서 세트 안에 같은 값을 여러 개 입력해 주어도, 실질적으로는 그중 한 개만 저장된다. 빈세트를 저장하기 위해서는, 변수명 = set()라고 선언하면 된다. 세트가 {}를 사용하기 때문에 그냥 변수명 = {}로 선언해도 될 것 같지만!! 그러면 안 되는 이유를 바로 다음 항목인 딕셔너리에서 설명하겠다.
# 기본 세트 선언
세트 = {값1, 값2, 값3}
# 세트 속 특정 값 찾기
값1 in 세트 # 값1이 세트 안에 존재하면 True, 그렇지 않으면 False 반환
# 빈 세트 선언
빈세트 = set()
# 세트 안에 중복된 요소가 있으면?
중복세트 = {값1, 값1, 값1, 값2, 값3} # 이렇게 선언하더라도 실질적으로 {값1, 값2, 값3}만 저장된다.
세트 연산
세트를 통해 할 수 있는 연산은 주로 리스트와 비슷하게 값을 추가, 제거하는 연산과 집합 연산이 있다. 새로운 값을 하나 추가하기 위해서는 add 함수, 새로운 값을 여러개 추가하기 위해서는 update 함수, 세트 속에 특정 값을 제거하기 위해서는 remove 함수를 사용하면 된다. remove 함수에서 제거하고자 하는 값이 세트 안에 존재하지 않으면 keyerror가 발생한다. 이런 에러를 막기 위해서는 discard()함수를 사용하면 된다. 집합연산은 다음과 같이 합집합, 교집합, 차집합, 여집합이 있다.
# 세트에 새로운 요소 추가하기 : add() 함수
세트.add(새값)
# 세트에 새로운 요소 여러개 추가하기 : update() 함수
세트.update((새값1, 새값2, 새값3))
# 세트가 가진 요소 제거하기 : remove() 함수
세트.remove(제거할값)
# 세트에 포함된지 모르는 요소 제거하기 : discard() 함수
세트.discard(제거하고싶은값)
# 세트에서 수행 가능한 집합 연산
세트1 | 세트2 # 합집합
세트1 & 세트2 # 교집합
세트1 - 세트2 # 차집합
세트1 ^ 세트2 # 여집합 = 합집합 - 교집합
4. 딕셔너리
딕셔너리는 이름처럼 사전과 같은 형식의 자료형이다. 딕셔너리는 리스트와도 비슷한데, 리스트는 내부의 요소를 인덱스를 통해 접근할 수 있고 딕셔너리는 키(key)를 통해 값(value)에 접근할 수 있다. 딕셔너리 속 요소들은 key와 value의 쌍으로구성되어 있다. Key값은 변하지 않는 값(immutable)으로, 숫자 자료형이나 문자열, 튜플과 같은 변경할 수 없는 자료형(immutable)은 사용가능하지만 리스트, 딕셔너리와 같은 변경할 수 있는 자료형(mutable)은 사용할 수 없다. Value값은 변해도 되는 값으로 자유롭게 수정할 수 있다. 딕셔너리를 정의할 때는, 대괄호 안에 key와 value의 쌍을 넣어 직접 선언하거나 dict(), {}를 통해서도 선언할 수 있다. 세트도 동일한 대괄호를 사용하지만 딕셔너리를 정의할 때 빈 대괄호를 사용하기 때문에 빈 세트는 반드시 set()를 통해서 선언해야 한다!!
# 기본 딕셔너리 선언
딕셔너리1 = {키1:값1, 키2:값2}
# 빈 딕셔너리 선언
빈딕셔너리1 = dict()
빈딕셔너리2 = {}
# 딕셔너리에 새로운 요소 추가하기
딕셔너리[새로운key값] = 새로운value값
# 딕셔너리에서 key를 사용해 특정 value 찾기
딕셔너리[찾고자하는값의키]
딕셔너리 연산
딕셔너리의 연산은 리스트와 비슷한 부분도 있고, 독자적인 부분도 있다. 딕셔너리 내의 값은 del()함수를 통해서 제거할 수 있다. 딕셔너리 내의 요소들은 key와 value의 두 가지 항목을 모두 포함하고 있기 때문에, 각각의 key와 value만을 따로 추출할 수 있는 key(), value() 함수가 있다. 두 가지 항목을 같이 불러오기 위해서는 items() 함수를 사용하면 된다.
# 딕셔너리가 가진 요소 제거하기 : del() 함수
del 딕셔너리[제거할값의key]
# 딕셔너리에서 key값만 가져오기 : keys() 함수
딕셔너리.keys()
# 딕셔너리에서 value값만 가져오기 : values() 함수
딕셔너리.values()
# 딕셔너리에서 key, value 쌍으로 모두 가져오기 : items() 함수
딕셔너리.items()
리스트와 같은 자료형을 다룰때 가장 많이 쓰이는 것이 인덱싱과 슬라이싱이다. 인덱싱과 슬라이싱에 대해서는 따로 포스팅을 작성하도록 하겠다.
'Python > Data Structure' 카테고리의 다른 글
[자료구조] 스택(stack) (1) | 2023.08.30 |
---|---|
[자료구조] 변수와 다양한 데이터 타입(자료형) (0) | 2023.08.15 |