Python 10. Data Structure

jonghyuck’s velog·2022년 7월 27일
0

Python 정리

목록 보기
11/12
post-thumbnail

✅ 순서가 있는 데이터 구조
✅ 순서가 없는 데이터 구조
✅ 얕은 복사와 깊은 복사

이번에는 데이터구조 (Data Structure)을 다뤄보려고 한다.
데이터 구조를 잘 활용하기 위해서는 메서드(method)를 활용해야한다.

  • 메서드는 클래스 내부에 정의한 함수, 사실상 함수와 동일
  • 쉽게 설명하자면 객체의 기능

데이터 구조. 메서드() 형태로 활용

파이썬 공식 문서의 표기법

  • python 구문이 아니며, 문법을 표현하기 위한 권장사항
str.replace(old,new[,count])
  • old, new는 필수/ [,count]는 선택적 인자를 의미

✅ 순서가 있는 데이터 구조

📍 문자열(String Type)

  • 문자들의 나열(sequence of characters)
    • 모든 문자열은 str타입(변경 불가능한 immutable)
  • 파이썬 권장 스타일 가이드인 PEP8에서는 소스코드 내에서 하나의 문장 부호(' 또는 ")를 선택하여 유지하도록함

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

문법설명
s.find(x)x의 첫 번째 위치를 반환. 없으면, -1반환
s.index(x)x의 첫 번째 위치를 반환. 없으면, 오류발생
s.isalpha()알파벳 문자 여부(유니코드상letter로, 한국어포함)
s.isupper()대문자 여부
s.islower()소문자 여부
s.istitle()타이틀 형식 여부

문자열 관련 검증 메서드

문자열 변경 메서드

문법설명
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(불변)이라고 했다. 어째서 변경이 되는걸까?

  • 해당 메서드들은 기존의 문자열을 변경하는 것이 아닌, 변경된 문자열을 새롭게 만들어서 반환하는 것이다.

📍 리스트(List)

리스트 메서드

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

📍 튜플(Tuple)

  • 튜플은 담고 있는 값 변경이 불가(immutable)
  • 리스트와 달리 소괄호 사용
  • 튜플은 변경할 수 없기 때문에 값에 영향을 미치지 않는 메서드만을 지원 ( 리스트와 비슷 )

✏️ 멤버십 연산자(Membership Operator)

'a' in 'apple' # True

해당 컨테이너에 in을 통해 특정 요소의 존재 여부를 확인
not in도 사용 가능

✏️ 시퀀스형 연산자(Sequence Type Operator)

[1,2] + ['a']
+(산술 연산자)를 통해 시퀀스간의 연결
[0] * 8
*(반복연산자)를 통해 시퀀스를 반복

✅ 순서가 없는 데이터 구조

📍 셋(Set)

  • set이란 중복되는 요소없이, 순서에 상관없는 데이터들의 묶음
  • 수학에서 집합을 표현하는 컨테이너
  • mutable
문법설명
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.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)

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

✅ 얕은 복사와 깊은 복사

🖍 얕은 복사

얕은복사는 값이 아닌, 주소값을 복사하는 복사이다. call by reference와 비슷한 개념으로, 복사후 원본 또는 복사본의 데이터를 건드리면 같은 주소를 공유하기 때문에 모든 값이 바뀌게 된다.

  • ex. slice연산자

🖍 깊은 복사

주소가 아닌 값을 복사하는 복사이다. 사실 파이썬에서는 모든 복사가 주소값을 복사하는 개념이지만 a=5와 같은 단순 copy의 경우 깊은복사에 해당된다.

또한,

import copy
a = [1,2,[3,4]]
b = copy.deepcopy(a)
print(a,b)
b[2][0] = 0
print(a,b)

[1,2,[3,4]] [1,2,[3,4]]

[1,2,[3,4]] [1,2,[0,4]]

이처럼, deepcopy메소드를 사용해서도 복사가 가능하다.

0개의 댓글