[파이썬데이터분석] 사전, 집합

imacusirius·2021년 11월 8일
0

파이썬데이터분석

목록 보기
9/12

사전

  • 일반적으로 해시맵 또는 연관 배열로 알려져 있음

  • 유연한 크기를 가지는 키-값

    • 키와 값은 모두 파이썬 객체
  • 사전 생성: {} 사용, 콜론으로 구분된 키와 값을 둘러싸는 것

  • 사전에 어떤 키가 있는지 확인하는 것은 리스트나 튜플 문법과 같음

‘b’ in d1
>> True
  • del 예약어나 pop 메서드를 사용해 사전의 값 삭제 가능

  • keys와 values 메서드는 각각 키와 값이 담긴 이터레이터 반환

  • 키-값 쌍은 일정한 기준으로 정렬 X / keys와 values 메서드에서 반환하는 리스트는 같은 순서 가짐

  • update 메서드 사용하면 하나의 사전을 다른 사전과 합칠 수 있음

    • 값을 그 자리에서 바꾸므로 이미 존재하는 키에 대해 update 호출 -> 이전 값은 사라짐

순차 자료형에서 사전 생성

  • 두 개의 순차 자료형에서 각 원소를 짝지어 사전으로 만들기
mapping = {}
for key, value in zip(key_list, value_list):
    mapping[key] = value

응용하면

mapping = dict(zip(range(5), reversed(range(5))))

기본값

  • 사전 메서드인 get, pop은 반환할 기본값을 받아 코드를 간단하게 작성할 수 있음
    (이전)
if key in some_dict:
    value = some_dict[key]
else:
    value = default_value

(get 메서드 사용)

Value = some_dict.get(key, default_value)
  • get 메서드는 해당 키가 존재하지 않을 경우 None 반환

  • pop 메서드는 예외 발생시킴

  • 내장 collections 모듈은 defaultdict라는 클래스를 가짐

    • 자료형 혹은 사전의 각 슬롯에 담길 기본값을 생성하는 함수를 넘겨 사전 생성
from collections import defaultdict
by_letter = defaultdict(list)
for word in words:
    by_letter[word[0]].append(word)

유효한 사전 키

  • 사전의 값은 어떤 파이썬 객체라도 가능
  • 키는 스칼라형이나 튜플처럼 값이 바뀌지 않는 객체만 가능
  • 기술적으로는 해시 가능해야 한다는 뜻
    • hash 함수로 해시 가능한지 검사할 수 있음
  • 리스트를 키로 사용하려면 리스트를 튜플로 변경해야 함

집합 (set)

  • 유일한 원소만 담는 정렬되지 않은 자료형
  • 사전과 유사하지만, 값은 없고 키만 가지고 있음
  • 생성: set 함수 이용 or 중괄호 이용
set([5, 1, 4, 14])
{5, 1, 4, 14}
  • 합집합, 교집합, 차집합, 대칭차집합 등 산술 집합 연산 제공

    • 합집합은 union 메서드 이용하거나 | 이항 연산자로 구함
    • 교집합은 intersection 메서드 이용하거나 & 이항 연산자로 구함
  • 일반적인 집합 메서드

함수대체문법설명
a.add(x)N/Aa에 원소 x 추가
a.clear()N/A모든 원소 제거, 빈 상태로 되돌림
a.remove(x)N/Aa에서 원소 x 제거
a.pop()N/Aa에서 임의의 원소 제거, 비어 있는 경우 KeyError 발생
a.union(b)``ab``
a.update(b)``a= b``
a.intersection(b)a & ba와 b의 교집합
a.intersection_update(b)a &= ba에 a와 b의 교집합 대입
a.difference(b)a - ba와 b의 차집합
a.difference_update(b)a -= ba에 a와 b의 차집합 대입
a.symmetric_difference(b)a ^ ba와 b의 대칭차집합
a.symmetric_difference_update(b)a ^= ba에 a와 b의 대칭차집합 대입
a.issubsetN/Aa의 모든 원소가 b에 속하면 True
a.issuperset(b)N/Aa가 b의 모든 원소를 포함할 경우 True
a.isdisjoint(b)N/Aa와 b 모두에 속하는 원소가 없을 경우 True
  • 집합 원소들도 일반적으로 변경 불가능해야 함
    • 리스트 같은 원소를 담으려면 튜플료 변경해야 함

0개의 댓글