Data Science Fellowship/Python

[Python] Built-in Data Type: 기본과 집합 자료형

graph-dev 2023. 11. 29. 16:53
728x90

 

python

 

 

내장된 데이터 타입

빌트인 데이터 타입이라는 말은 어색합니다. 내장된 자료형이죠.

 

언어 자체가 제공하는 자료형(기본 자료형), 컬렉션 자료형(집합 자료형)으로 나눕니다. 기본 자료형은 정수형, 부동소수형, 문자열 타입이 있고, 집합 자료형은 리스트, 튜플, 셋, 딕셔너리가 있습니다.

 

 

정수형 int

기호 정도만 알면 됩니다. +, -, *, /, //, %, 부호(-), abs()이렇게 있습니다.

 

부동소수형 float

정수형과 동일합니다. 차이가 있다면, 오차가 발생한다는 점입니다. 즉, 앱실론(epsilon)이라는 오차가 있습니다. 파이썬이 부동소수형 데이터를 이진법으로 표현할 때, 그 과정에서 발생하는 오차를 말합니다.

 

앱실론 epsilon

부동소수형 데이터는 오차 허용 범위를 명시할 수 있습니다. 문제 분석할 때, 확인해봅니다.

import sys
# 앱실론 출력
print(sys.float_info.epsilon)

# 부동소수점은 오차 검사를 합니다.
a = 0.2 + 0.2 + 0.2
b = 0.6

print(a - b)

# 검사: 오차 < 부동소수점이면 같은 값 출력
if abs(a - b) < sys.float_info.epsilon:
	print("a와 b 같다.")
else:
	print("a와 b 다르다.")

 

이걸 실행해보면, 'a와 b 같다.' 문장이 나타납니다. 부동소수점 오차보다 작다는 것입니다. 코딩 테스트에서 이를 무시하면, 일부 테스트 케이스가 통과하지 못한다고 합니다. 이런건 직접 경험해봐야 알겠네요.

 

컬렉션 데이터 타입

집합 자료형이라고도 하죠. 리스트, 튜플, 딕셔너리, 셋, 문자열 등이 있습니다. 여기서 또 객체를 두 가지로 나눕니다. 변경 가능한(mutable), 불변의(immutable) 객체로 나눕니다. 

 

변경 가능한 객체 (mutable)

변경 가능한 객체는 리스트, 딕셔너리, 셋(Set)이 있습니다. 생성 후 수정할 수 있으니 변경 객체입니다. 

mutable object는 리스트, 딕셔너리, 셋입니다. 수정이 가능합니다.

 

리스트 (List): 인덱싱, 슬라이싱

mutaList = [1,2,3,4,5]
mutaList[4] = 6
print(mutaList) # 5번째 위치 값인 5를 6으로 수정

 

위 결과값은 [1,2,3,4,6]이 됩니다. 즉, 5가 6으로 잘 변경되었습니다.

 

리스트는 순서가 있는 자료형입니다. 또한, 인덱싱, 슬라이싱이라는 개념이 있습니다.

인덱싱은 인덱스로 특정 위치의 원소에 접근할 수 있는 것입니다. 인덱싱으로 원소에 접근할 수 있습니다. 삭제도 가능하겠죠?

mutaList = [1,2,4]
mutaList.append(6) # 값 추가
print(mutaList) # [1, 2, 4, 6]

del mutaList[1] # 값 삭제, 2번째 위치인 2가 사라집니다.
print(mutaList) # [1, 4, 6]

 

 

슬라이싱은 범위를 지정해서 값을 가져오는 방식입니다. 한번에 여러개를 가져올 수 있겠네요.

리스트[x:y]

 

이렇게 작성하면, 인덱스 x부터 y-1번째까지 원소를 반환합니다. 참고로, 인덱스는 음수도 가능합니다. 헷갈리겠죠?

## 리스트: 슬라이싱
print("-"*10 + "리스트 슬라이싱" + "-"*10)
mutaList = [1,2,3,4,5]
print(mutaList[0:2]) # [1,2] 0부터 1번째까지
print(mutaList[1:]) # [2,3,4,5] 1번째 인덱스부터 끝까지
print(mutaList[:4]) # [1,2,3,4] 처음부터 3번째 인덱스
print(mutaList[-4:-1]) # [2,3,4] 이거 헷갈릴 수 있다.

 

음수 인덱스는, 쉽게 생각하면 -1부터 시작하는 인덱스입니다. -1이 마지막 인덱스와 같습니다.

좀 어려울 수 있는데, 이 리스트가 5개 원소라면, 5-1번째 인덱스부터 거꾸로 생각할 수 있습니다. 예를 들어, -1 인덱스는 4번째 인덱스 원소와 같은 거죠. (전체 원소 개수 + 음수 인덱스 값)으로 생각하면 편합니다.

 

딕셔너리 (Dictionary)

딕셔너리도 변하는 객체이고 키와 값의 쌍으로 저장하는 해시 테이블입니다. 키(key)로 값을 찾아낼 수 있겠습니다. 중괄호 {}를 사용하는 것이 특징입니다.

참고로 딕셔너리는 초기화를 해줘야 삽입이 가능합니다.

# 딕셔너리 초기화
muDict = {}

# 딕셔너리 삽입: 초기화를 수행해야 정상적으로 작동
muDict["a"] = 1
muDict["b"] = 2
muDict["c"] = 3

# 딕셔너리 출력
print(muDict) # {'a': 1, 'b': 2, 'c': 3}

 

 

검색은 'in'이라는 예약어를 사용해볼 수 있습니다. 일치하는 키 값이 있으면 키와 값을 출력하는 예제를 보겠습니다. 모두 순회하는 게 장점이네요. 간단하죠?

## 딕셔너리 검색
exkey = "a"
if exkey in muDict:
    val = muDict[exkey]
    print(f"{exkey} : {val}") # a : 1
else:
    print(f"{exkey}는 없다.")

 

참고로 f"{}" 이 방법은 일종의 변수값을 그대로 뽑아낼 때 유용한 방법입니다. print() 출력 함수와 함께 사용하네요.

 

딕셔너리의 수정과 삭제는 다음 글을 참고해주세요. 삭제의 경우에는 값이 있는지 'in' 예약어로 확인 후 삭제하는 것을 권장합니다. 이것이 예외 처리가 되겠죠?

https://graph-dev.tistory.com/96

 

[Python] Dictionary 구조

Dictionary Python 언어에는 딕셔너리(Dictionary)라는 구조가 있습니다. 간단한 코드로 살펴보겠습니다. europe = {'spain':'madrid', 'france':'paris', 'germany':'berlin', 'norway':'oslo' } # europe 딕셔너리의 키값을 출력

graph-dev.tistory.com

## 딕셔너리 예외처리
muDict = {"a": 1, "b": 2, "c": 3}

key = "d"

if key in muDict:
    print(f"val: {muDict[key]}")
else:
    print(f"'{key} is None in {muDict}")
    ## 'd is None in {'a': 1, 'b': 2, 'c': 3}

 

셋 (Set)

하나, 둘, 셋이 아니라, 세트의 Set입니다. 이건 중복이 허용되지 않는 집합 자료형이고, 수정은 가능하다고 보시면 됩니다.

testSet = set([1,2,3,3])
print(testSet) # {1, 2, 3}

 

이렇게 3을 두번 넣어도, 출력하면 한번만 나오는 똑똑한 친구입니다. 중복을 허용하지 않는 패턴에서 활용하기 좋겠네요.

 

불변의 객체 (immutable)

불변 객체는 정수, 부동소수점, 문자열, 튜플이 있습니다. 생성하면 수정이 안 됩니다. 여기서는 앞에서 다루지 않은 튜플과 문자열을 살펴볼 것입니다.

 

튜플(Tuble)

소괄호()를 사용합니다. 수정, 삭제는 안되지만, 인덱싱과 슬라이싱이 됩니다. 슬라이싱은 음수 인덱스를 통해서는 아무것도 출력이 안되네요. 신기합니다.

# 초기화
imTuble = (1,2,3,4,5)

## 튜플: 인덱싱, 슬라이싱같은 조회는 가능함
### 인덱싱
print(imTuble[0])
print(imTuble[1])
print(imTuble[-1])

### 슬라이싱
print(imTuble[0:1])
print(imTuble[:2])
print(imTuble[2:])
print(imTuble[-1:-2]) # () 음수 인덱스 슬라이싱 불가?

 

코딩테스트를 수행할 때, 원소 값이 실행하다가 바뀌면 안되는 모든 케이스에 사용해봐야겠습니다.

 

문자열 (String)

문자열은 문자의 모임입니다. 역시 불변의 객체입니다. 초기화할 땐, 크고 작은 따옴표("", '')를 사용해서 넣어주시면 됩니다. 수정, 삭제는 되지 않습니다. 그런데 Python에서 이 문자열은 트릭이 있습니다. 살펴보면 다음과 같습니다.

# 초기화
str1 = "test"
str2 = 'test'

## 추가, 삭제: 수정이 아니라 새 객체 반환
str1 = "test"
str1 += "graph"
print(str1)

## 수정과 삭제: replace()로 가능
str2 = "test"
str3 = str2.replace("t", "t1")
str2 = str2.replace("t", "") # t 모두 제거
print(str3) # t1est1
print(str2) # es

 

수정과 삭제를 replace로 모두 가능하다는 점, 기억해두면 좋겠습니다. 또한, 초기화가 필요한 점도 알아두면 좋죠.