Search
📝

TIL 22/07/25 (월)

TIL (Today I Learned)

데이터 구조 (Data Structure)

데이터 구조를 활용하기 위해서는 메서드(method) 활용
메서드는 클래스 내부에 정의한 함수, 사실상 함수 동일
→ 쉽게 설명하면 객체의 기능
데이터구조.메서드() 형태로 활용
List.append(10)
String.split()

파이썬 공식 문서의 표기법 (배커스-나우르 표기법)

컴퓨터 언어에서 언어의 문법을 수학적인 수식으로 나타낼 때 사용하는 언어 도구
프로그래밍 언어의 구문을 기술하는 데 매우 자연스러운 표기법
python 구문이 아니며, 배커스-나우르 표기법(문서 표준)일 뿐
str.replace(old, new[,count])
old, new는 필수
[,count]는 선택적 인자

문자열 (String Type)

문자열들의 나열 (sequence of characters)
모든 문자는 str 타입 (변경 불가능한 immutable)
작은 따옴표()나 큰 따옴표()를 활용하여 표기
문자열을 묶을 때 동일한 문장부호 활용
PEP8에서는 소스 코드 내 하나의 문장부호를 선택하여 유지하도록 함
print('hello') # hello print(type('hello')) # <class 'str'> print('철수 "안녕"') # 철수 "안녕" print("철수 '안녕'") # 철수 '안녕'
Python

문자열 조회/탐색 및 검증 메서드

s.find(x): x의 첫 번째 위치를 반환. 없으면, -1을 반환
s.index(x): x의 첫 번째 위치를 반환. 없으면, 오류 발생
s.isalpha(): 알파벳 문자 여부 (단순 알파벳이 아닌 유니코드 상 Letter, 한글도 가능)
s.isupper(): 대문자 여부
s.islower(): 소문자 여부
s.istitle(): 타이틀 형식 여부
.isdecimal().isdigit().isnumeric()

문자열 변경 메서드

s.replace(old, new[,count]): 바꿀 대상 글자를 새로운 글자로 바꿔서 반환
s.strip([chars]): 공백이나 특정문자를 제거
s.split(sep=None, maxsplit=-1): 공백이나 특정 문자를 기준으로 분리
'separator'.join([iterable]): 구분자로 iterable을 합침
s.capitalize(): 가장 첫 번째 글자를 대문자로 변경
s.title(): 문자열 내 띄어쓰기 기준으로 각 단어의 첫글자는 대문자, 나머지는 소문자로 변환
s.upper(): 모두 대문자로 변경
s.lower(): 모두 소문자로 변경
s.swapcase() : 대 소문자 서로 변경

문자열은 immutable(불변형)인데, 문자열 변경이 되는 이유?

기존의 문자열을 변경하는 게 아니라, 변경된 문자열을 새롭게 만들어서 반환
replace, strip, title

리스트 (List)

여러 개의 값을 순서가 있는 구조로 저장하고 싶을 때 사용

리스트의 생성과 접근

대괄호([]) 또는 list()를 통해 생성
파이썬에서는 어떠한 자료형도 저장 가능, 리스트 안에 리스트 구조도 가능
생성 후 내용 변경이 가능한 가변 자료형
순서가 있는 시퀀스로 인덱스를 통해 접근 가능
값에 대한 접근은 list[i]

리스트 메서드

L.append(x): 리스트 마지막에 항목 x를 추가
L.insert(i, x): 리스트 인덱스 i에 항목 x를 삽입
L.remove(x): 리스트 가장 왼쪽에 있는 항목(첫 번째) x를 제거. 존재하지 않을 경우 ValueError
L.pop(): 리스트 가장 오른쪽에 있는 항목(마지막)을 반환 후 제거
L.pop(i): 리스트 인덱스 i에 있는 항목을 반환 후 제거
L.extend(m): 순회형 m의 모든 항목들의 리스트 끝에 추가 (+=과 같은 기능)
L.index(x, start, end): 리스트에 있는 항목 중 가장 왼쪽에 있는 항목 x의 인덱스 반환
L.clear(): 모든 항목을 삭제
L.reverse(): 리스트를 거꾸로 정렬
L.sort(): 리스트를 정렬 (매개변수 이용가능)
L.count(x): 리스트에서 항목 x가 몇 개 존재하는지 갯수 반환

튜플 (Tuple)

튜플은 여러 개의 값을 순서가 있는 구조로 저장하고 싶을 때 사용
리스트와의 차이점: 담고 있는 값 변경 불가 (불변 자료형
항상 소괄호 형태로 사용

튜플 관련 메서드

튜플은 변경이 불가하기 때문에 값에 영향을 미치지 않는 메서듬나 지원
리스트 메서드 중 항목 변경 메소드들을 제외하고 대부분 동일

셋 (Set)

중복되는 요소 없이, 순서에 상관없는 데이터들의 묶음
중복되는 원소가 있다면 하나만 저장
순서가 없어 인덱스로 접근 불가능
수학에서의 집합을 표현한 컨테이너
집합 연산 가능(여집합을 표현하는 연산자는 별도로 존재 X)
중복되는 값 존재 X
담겨 있는 요소 삽입, 변경, 삭제 가능 → 가변형

셋 메서드

s.copy(): 셋의 얕은 복사본 반환
s.add(x): 항목 x가 셋 s에 없다면 추가
s.pop(): 셋 s에서 랜덤하게 항목을 반환하고, 해당 항목 제거. set이 비어 있으면 KeyError
s.remove(s): 항목 x를 셋 s에서 삭제. 항목이 존재하지 않을 경우, KeyError
s.discard(x): 항목 x가 셋 s에 있는 경우, 항목 x를 셋s에서 삭제
s.update(t): 셋 t에 있는 모든 항목 중 셋 s에 없는 항목을 추가
s.clear(): 모든 항목을 제거
s.isdisjoint(t): 셋 s가 셋 t의 서로 같은 항목을 하나라도 갖고 있지 않은 경우 True 반환
s.issubset(t): 셋 s가 셋 t의 하위 셋인 경우, True 반환
s.issuperset(t): 셋 s가 셋 t의 상위 셋인 경우, True 반환

딕셔너리 (Dictionary)

key-value 쌍으로 이루어진 자료형(3.7부터는 ordered, 이하는 unordered)
딕셔너리의 key
key는 변경 불가능한 데이터만 활용 가능
string, integer, float, boolean, tuple, range
keyvalues
어떤 형태든 상관없음

딕셔너리 메서드

d.clear(): 모든 항목을 제거
d.copy(): 딕셔너리 d의 얕은 복사본을 반환
d.keys(): 딕셔너리 d의 모든 키를 담은 뷰를 반환
d.values(): 딕셔너리 d의 모든 값을 담은 뷰를 반환
d.items(): 딕셔너리 d의 모든 키-값의 쌍을 담은 뷰를 반환
d.get(k): 키 k의 값을 반환하는데, 키 k가 딕셔너리 d에 없을 경우 None을 반환
d.get(k, v): 키 k의 값을 반환하는데, 키 k가 딕셔너리 d에 없을 경우 v을 반환
d.pop(k): 키 k의 값을 반환하고 키 k인 항목을 딕셔너리 d에서 삭제하는데, 키 k가 딕셔너리 d에 없을 경우 KeyError를 발생
d.pop(k, v): 키 k의 값을 반환하고 키 k인 항목을 딕셔너리 d에서 삭제하는데, 키 k가 딕셔너리 d에 없을 경우 v를 반환
d.updatepop([other]): 딕셔너리 d의 값을 매핑하여 업데이트

얕은 복사와 깊은 복사 (Shallow Copy & Deep Copy)

복사 방법

할당 (Assignment)
얕은 복사 (Shallow Copy)
깊은 복사 (Deep Copy)

할당 (Assignment)

대입 연산자 (=)
리스트 복사 확인하기

얕은 복사 (Shallow Copy)

Slice 연산자를 활용하여 같은 원소를 가진 리스트지만 연산된 결과를 복사 (다른 주소)
주의 사항
복사하는 리스트의 원소가 주소를 참조하는 경우: 리스트 안의 리스트는 얕은 복사 불가

깊은 복사 (Deep Copy)

리스트 복사 확인하기

WIF (What I Felt)

파이썬 자료 구조의 다양한 메서드들에 대해 알아볼 수 있었다.
알고리즘 문제 풀며 자주 썼었던 메서드도 있었지만, 생소한 메서드들도 한번 싹 정리할 수 있었다!
앞으로 알고리즘 문제 풀이에 적재적소에 사용할 수 있길 바라며..
할당 & 얕은 복사 & 깊은 복사
처음으로 해당 개념을 제대로 학습하는 기회였다.
할당은 동일한 주소를 계속 참조, 얕은 복사는 리스트 안의 리스트는 여전히 주소가 동일하다는 점, 깊은 복사는 완전 다른 주소를 가지니, 마음껏 값을 변경해도 서로 영향을 주지 않다는 점
왜 이 땐 할당을 쓰고, 이 떈 deepcopy()를 쓰고 하는지 깊게 생각을 하지 않고, 그 동안은 그냥 손에만 익혀서 사용하고 있었다.
이제는 누군가에 자신있게 차이점을 설명할 수 있게 되었을까?
머릿속에서 다시 한번 더 정리하면서 나만의 언어로 만들자!