All Articles

Python - 자료 구조 2 (set, dictionary, hash)

Set 형식

Set은 dictionary와 동일하게 {}로 감싼다. 단, {key: value} 형식이 아니라 {element1, element2, element3} 형식이다.


Set 특징

  1. 비순차적 순열 자료구조 Set은 list와 달리 순서(=인덱스)가 존재하지 않는다. 데이터를 비순차적으로 저장한다. list는 삽입 순서대로 인덱스 번호가 부여되어 순서를 가지지만 set은 삽입 순서대로 저장되지 않는다.
  2. 수정 가능 Set을 이미 선언했더라도 요소를 삭제하거나 추가할 수 있다. 단, 요소를 추가할 때 set이름.append(요소) 형식이 아니라 set이름.add(요소)로 추가해야한다.
  3. 중복 비허용 동일한 값을 삽입할 수 없다. 만약 set 내에 이미 있는 요소를 또 삽입한다면 새로 삽입된 값을 대체한다.

Set을 사용하면 좋은 경우

  • 중복된 값을 골라내야 할 때
  • 빠르게 lookup 해야할 때
  • 그러면서 요소 순서는 상관없을 때

frozenset이란?

Set은 요소 추가, 수정이 가능한 자료구조다. frozenset은 선언 이후 수정이 불가능하다.


Dictionary와 hash

Dictionary는 key - value 형태로 값을 저장할 수 있는 자료구조다. 이를 연관 배열(Associative array) 또는 해시(Hash)라고 한다.

해시 함수(hash function)는 문자열을 받아서 숫자를 반환하는 함수다. 함수는 문자열에 대해 숫자를 할당한다. input값이 같으면 반드시 할당하는 숫자도 같아야 한다. 그러므로 set에서 중복 요소를 허용하지 않는 것이다. 반대로 input값이 다르면 반드시 할당하는 숫자도 달라야 한다.

Dictionary는 hash table/hash map이라고도 한다. Dictionary에 요소가 추가된 순서와 관계 없이 key값의 hash값을 구한 후 해당 hash값이 속한 bucket에 값을 저장한다. 그렇기 때문에 dictionary와 set은 비순차적 자료구조가 되는 것이다.


Dictionary 특징

  1. 비순차적 순열 자료구조 Set과 마찬가지로 특정 순서대로 데이터를 리턴하지는 않는다. 그러므로 Dictionary에서는 key값으로 value를 찾아야 한다.

my_dict = {1 : 'one', 'two' : 2, 3 : 3.0, 1: 'one_one'}

mydict 딕셔너리에서 “two” 키의 값 2를 리턴하고 싶다면 `mydict[1]이 아니라mydict[‘two’]로 찾아야 한다.mydict[1]의 리턴 값은‘one’` 이다.

  1. 수정 가능 Dictionary를 이미 선언했더라도 요소를 삭제하거나 추가할 수 있다. my_dict 딕셔너리에 새 요소를 추가하고 싶다면,

my_dict['new key'] = 'new value'

새로운 key값에 value를 할당해주면 된다.

  1. 중복 비허용 Key값은 중복될 수 없다. 중복된 key가 삽입되면 새 key가 기존 key와 value를 대체한다.

Dictionary를 사용하면 좋은 경우

  • 키와 값을 묶어서 데이터를 표현해야 할 때 (예: 데이터베이스)