Python 데이터 구조 2

이남경·2024년 1월 23일
0

SSAFY 11기

목록 보기
9/67

비시퀀스 데이터 구조


비시퀀스 데이터 구조 (인덱스로 접근이 불가능한 친구들, slicing 불가)

set

고유한 항목들의 정렬되지 않은 컬렉션 (중복 없고 연속적이지 않다.)

.add(x)

세트에 x를 추가

빈 세트를 만들고자 할 때 my_set = set() 이렇게 나타내줘야 한다.

세트는 순서가 존재하지 않는다. → 출력했을 때 결과가 계속 바뀔 수 있다.

중복된 요소가 없어야 하기 때문에 4를 한번 더 추가해도 요소가 늘어나지 않는다.

.clear()

세트의 모든 항목을 제거

.remove()

세트에서 항목 x를 제거

.discard()

세트 s 에서 항목 x를 제거. remove와 달리 에러 없음

없는 요소를 제거하고자 할 땐 아무런 반응 없음

.pop()

세트에서 임의의 요소를 제거하고 반환 → 결과를 예측할 수 없다.

.update(iterable)

세트에 다른 iterable 요소를 추가 ( list extend 와 유사)

difference = 차집합

intersection = 교집합

issubset = return이 True 아니면 False로 나옴 set 1 전체 항목이 set2에 포함될 때

issuperset = set2 전체 항목이 set1에 포함될 때

union = set1 과 set2의 합집합

딕셔너리 (dictionary)

고유한 항목들의 정렬되지 않은 컬렉션

key : value 형태의 자료형

.clear()

딕셔너리 D의 모든 키/값 쌍을 제거

.get(key[,default])

키 연결된 값을 반환하거나 키가 없으면 None 혹은 기본 값을 반환

key 가 리턴되었을 때 값을 컨트롤 할 수 있음

없는 키값을 입력했을 땐, 내가 지정한 person.get('country', 'Unknown') 처럼 Unknown 키를 반환함

.keys()

딕셔너리 키를 모은 객체를 반환

.values()

딕셔너리 값을 모은 객체를 반환

.items()

딕셔너리 키/값 쌍을 모은 객체를 반환

.pop(key[,default])

키를 제거하고 연결됐던 값을 반환 (없으면 에러나 default를 반환)

존재하지 않는 키 값을 pop 하면 에러가 발생한다.

에러가 나는 것을 방지하고 싶으면 None을 Value 위치에 작성하면 된다.

.setdefault(key[,default])

키와 연결된 값을 반환한다. 키가 없다면 default와 연결한 키를 딕셔너리에 추가하고 default 를 반환

.update([other])

other 가 제공하는 키/값 쌍으로 딕셔너리를 갱신, 기존 키는 덮어씀

해시 테이블


해시 테이블 (Hash Table)

해시 함수를 사용하여 변환한 값을 색인(index)으로 삼아 키 (key)와 데이터 (value)를 저장하는 자료구조

데이터를 효율적으로 저장하고 검색하기 위해 사용

해시 테이블 원리

키를 해시 함수를 통해 해시 값을 변환하고, 이 해시 값을 인덱스로 사용하여 데이터를 저장하거나 검색

데이터 검색이 매우 빠르게 이루어짐

해시(Hash)

임의의 크기를 가진 데이터를 고정된 크기의 고유한 값으로 변환하는 것

이렇게 생성된 고유의 값은 주로 해당 데이터를 식별하는 데 사용될 수 있음

  • 일종의 '지문'과 같은 역할
  • 데이터를 고유하게 식별

파이썬에서는 해시 함수를 사용해서 데이터를 해시 값으로 변환하며, 이 해시 값은 정수로 표현됨

해시 함수 (Hash function)

임의의 길이의 데이터를 입력 받아 고정된 길이의 데이터 (해시 값)를 출력하는 함수

주로 해시 테이블 자료구조에 사용되며, 매우 빠른 데이터 검색을 위한 컴퓨터 소프트웨어에서 유용하게 사용

목적 : 데이터 검색을 효율적으로 빠르게 검색하기 위해서

set의 요소 & dictionary의 키와 해시테이블 관계

파이썬에서 세트의 요소와 딕셔너리의 키는 해시 테이블을 이용하여 중복되지 않는 고유한 값을 저장함

세트 내의 각 요소는 해시 함수를 통해 해시 값으로 변환되고, 이 해시 값을 기반으로 해시 테이블에 저장됨

마찬가지로 딕셔너리 키는 고유해야 하므로, 키를 해시 함수를 통해 해시 값으로 변환하여 해시 테이블에 저장

  • 따라서 딕셔너리의 키는 매우 빠른 탐색 속도를 제공하며, 중복된 값을 허용하지 않음

실행할 때 마다 결괏 값이 바뀔 것이다. (X)

결괏값이 항상 동일하게 나옴 → 정수는 해시값 그대로 사용

결괏값이 나온 순서는 해시 테이블에 나열된 순서와 같다!

문자열은 해시 함수가 수행될 때 마다 변함

파이썬에서의 해시 함수

파이썬에서 해시 함수의 동작 방식은 객체의 타입에 따라 달라짐

정수와 문자열은 서로 다른 타입이며, 이들의 해시 값을 계산하는 방식도 다름

문자열은 해시 값이 계속 변하는 것을 확인할 수 있음 = 해시 테이블 주소가 다르다

파이썬에서의 해시 함수 - 정수

같은 정수는 항상 같은 해시 값을 가짐

해시 테이블에 정수를 저장할 때 효율적인 방법

예를 들어, hash(1)과 hash(2)는 항상 서로 다른 해시 값을 갖지만, hash(1)은 항상 동일한 해시 값을 갖게 됨

파이썬에서의 해시 함수 - 문자열

문자열은 가변적인 길이를 갖고 있고, 문자열에 포함된 각 문자들의 유니코드 코드 포인트 등을 기반으로 해시 값을 계산

이로 인해 문자열이 해시 값은 실행 시마다 다르게 계산됨

set의 pop 메서드의 결과와 해시 테이블의 관계

pop 메서드는 set에서 임의의 요소를 제거하고 반환

실행할 때마다 다른 요소를 얻는다는 의미에서의 '무작위'가 아니라 '임의'라는 의미에서 '무작위'

  • By 'arbitrary' the docs don't mean 'random'

해시 테이블에 나타나는 순서대로 반환하는 것

hashable

hash() 함수의 인자로 전달해서 결과를 반환 받을 수 있는 객체를 hashable이라 함

대부분 불변형 데이터 타입은 hashable

단, tuple의 경우 불변형이지만 해시 불가능한 객체를 참조할 때는 tuple 자체도 해시 불가능해지는 경우가 있음

hashable과 불변성 간의 관계

해시 테이블의 키는 불변해야 함

  • 객체가 생성된 후에 그 값을 변경할 수 없어야 함

불변 객체는 해시 값이 변하지 않으므로 동일한 값에 대해 일관된 해시 값을 유지할 수 있음

단, 'hash 가능하다!= 불변하다'

가변형 객체가 hashable 하지 않은 이유

값이 변경될 수 있기 때문에 동일한 객체에 대한 해시 값이 변경될 가능성이 있음 (해시 테이블의 무결성 유지 불가)

가변형 객체가 변경되면 해시 값이 변경되기 때문에, 같은 객체에 대한 서로 다른 해시 값이 반환될 수 있음 (해시 값의 일관성 유지 불가)

hashable 객체가 필요한 이유

  1. 해시 테이블 기반 자료 구조 사용
  • set와 dict의 키

  • 중복 값 방지

  • 빠른 검색과 조회

  1. 불변성을 통한 일관된 해시 값

  2. 안정성과 예측 가능성 유지

0개의 댓글

관련 채용 정보