PLOD

[python] Tuple , Dictionary(dict) , Set 본문

개발 공부/Python

[python] Tuple , Dictionary(dict) , Set

훌룽이 2022. 7. 30. 16:31

tuple()  :  (a,b,c,d...)

  • 리스트는 [ ]으로 둘러싸지만 튜플은 소괄호 ( )로 둘러싼다.
  • 리스트는 그 값의 생성, 삭제, 수정이 가능하지만 튜플은 그 값을 바꿀 수 없기 때문에 데이터가 변조되지 않도록 저장할 수 있다. 

  • max 함수는 튜플 안에 있는 값 중 가장 큰 값을 반환
  • min 함수는 튜플 안에 있는 값중 가장 작은 값을 반환
  • sum 함수는 튜플 안에 있는 원소의 합을 반환
  • count 함수는 튜플 안에 있는 특정 원소의 개수를 반환
  • index 함수는 튜플 안에 있는 특정 원소의 인덱스를 반환

dict() : { Key1 : Value1 , Key2 : Value2 , Key3 : Value3 , ... }

  • 딕셔너리는 이름 그대로 사전 형태의 자료형을 의미한다.
  • 키(key)와 값(value)을 쌍을 데이터로 가지는 자료형이다.
  • 앞서 다루었던 리스트나 튜플은 값을 순차적으로 저장한다는 특징이 있다. python의 dictionary 자료형은 hash table을 이용하므로 기본적으로 데이터의 검색과 수정에 있어서 O(1)로 매우 빠른 속도록 수행 할 수 있다
  • 해시함수(Hash Function)를 사용하여 키를 해시값(Hash Value)로 변환
data = dict()

data['사과'] = 'Apple'
data['바나나'] = 'Banana'
data['코코넛'] = 'Coconut'

print(data)
{'사과' : 'Apple', '바나나' : 'Banana' , '코코넛' : 'Coconut'}
  • 딕셔너리는 중괄호 '{}' 로 데이터 값을 둘러싼다.
  • 딕셔너리는 리스트나 튜플처럼 순차적으로(sequential) 해당 요솟값을 구하지 않고 Key를 통해 Value를 얻는다.
  • 이것이 바로 딕셔너리의 가장 큰 특징이다. 딕셔너리에서 value는 중복되어도 상관없지만, key는 중복될 수 없다.
  • python의 딕셔너리는 해시로 되어있어 정렬되지 않고, 시간 복잡도가 O(1)이다.
시간 복잡도 기능 사용 예시
O(1)

조회 data[1] / data.get(key)
값 할당 data[1] = 1
길이 가져오기 len(data)
값 제거 del data[key] / data.pop(key) / data.popitem()
딕셔너리 초기화 data.clear()
딕셔너리 키 가져오기 data.keys()
딕셔너리 키 삽입 data[key].append(value)
O(n)

딕셔너리 할당 dict(data) / difaultdict(int)
딕셔너리 전체 연산 for i in data
딕셔너리 정렬 data = sorted(data.items()
, reverse=False)

※ defaultdict()

defaultdict는 딕셔너리를 만드는 dict 클래스의 서브 클래스이다. 작동하는 방식은 거의 동일한데 , defaultdict()는 인자로 주어진 객체의 기본값을 딕셔너리 값을 괄호안의 자료형으로 초기 값으로 지정할 수 있다.

from collections import defaultdict

int_dict = defaultdict(int);		# default 값이 int인 딕셔너리를 생성한다.

print(int_dict[1]);

 

ex)  baekjoon 문제 1302 - 베스트셀러

https://www.acmicpc.net/problem/1302

 

1302번: 베스트셀러

첫째 줄에 오늘 하루 동안 팔린 책의 개수 N이 주어진다. 이 값은 1,000보다 작거나 같은 자연수이다. 둘째부터 N개의 줄에 책의 제목이 입력으로 들어온다. 책의 제목의 길이는 50보다 작거나 같고

www.acmicpc.net

N = int(input())
books = dict()
for _ in range(N) :
  name = input()
  if name in books :					# 딕셔너리의 in은 key에 한해서 적용된다.
    books[name] += 1
  else :
    books[name] = 1

max_val = max(books.values())
arr = []
for k,v in books.items() :
  if v == max_val :
    arr.append(k)

arr.sort()
print(arr[0])

set()  :  집합

  • 파이썬에서 set을 처리하기 위한 집합 자료형을 제공하고 있다.
  • 집합은 기본적으로 리스트 혹은 문자열을 이용해서 만들 수 있는데, 집합은 다음과 같은 특징이 있다. 
  • set은 중복을 허용하지 않고 순서가 없다
  • 집합 자료형은 순서가 없기 때문에 인덱싱을 사용할 수 없다. 하지만 시간복잡도가 딕셔너리와 같은 O(1) 이므로 빠른 속도를 자랑한다. 
시간 복잡도 기능 사용 예시
O(n) 길이 가져오기 len(data)
요소 추가 data.add(5)
집합에 값이 있는 지 확인  if 5 in data
값 제거 data.remove(a) / data.discard(a) / 
data.pop()
집합 초기화 data.clear()

※ data.remove(a) / data.discard(a)는 원소를 삭제한다는 점이 같지만 다른점은 discard는 원소가 없어도 KeyError를 생성하지 않는다.

시간 복잡도 기능 사용 예시
O(n)

집합 할당 data = set()
집합 검사 data == data2 , data != data2
집합 비교 data <= data2 , data >= data2
집합 연산 data | data2, data & data2 , data - data2 , data ^ data2
집합 전체 연산 for v in data
집합 복사 data.copy()
집합 정렬 data = sorted(data, reverse=false)

 

a = set([1,2,3,4,5])
b = set([3,4,5,6,7])

a.add(6)			# 집합 원소 추가
b.add(8)

a.update([7,8])		# 집합 여러 원소 추가
b.discard(3)		# 집합 원소 제거

print(a|b)			# 합집합
print(a&b)			# 교집합
print(a-b)			# 차집합

 

ex) baekjoon 7785 - 회사에 있는 사람

https://www.acmicpc.net/problem/7785

 

7785번: 회사에 있는 사람

첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 106) 다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 "enter"나 "leave"가 주어진다. "enter"인 경우는

www.acmicpc.net

n = int(input())
company = set()
for _ in range(n) :
  name,el = input().split()
  if el == "enter" :
    company.add(name)
  else :
    if name in company :
      company.discard(name)
  
for name in sorted(company,reverse=True) :
  print(name)

※ Counter

collections 모듈의 Counter 클래스는 말 그대로 각 원소가 몇개 있는지 세주는 클래스이다 . 파이썬에서 다음과 같이 Import 하여 Counter 클래스를 사용할 수 있다.

from collections import Counter

arr = [1,2,2,3,3,3]

arr_cnt = Counter(arr)						# Counter({3: 3, 2: 2, 1: 1})

Counter 생성자는 중복된 데이터가 저장된 배열을 인자로 넘기면 각 원소가 몇 번씩 나오는지 저장된 객체를 얻게 된다.

각 배열의 원소를 딕셔너리의 키 값으로 생각하고 해당하는 원소의 개수를 value 값으로 생각하면 된다.

 

참고)

https://wikidocs.net/16043

 

17. dictionary(딕셔너리)

## 1. dictionary(딕셔너리) - 딕셔너리 타입은 immutable한 키(key)와 mutable한 값(value)으로 맵핑되어 있는 순서가 없는 집합입니다. - …

wikidocs.net

파이썬 딕셔너리와 람다식을 통한 정렬 (velog.io)

 

파이썬 딕셔너리와 람다식을 통한 정렬

코딩테스트를 풀다 딕셔너리를 정렬하는 순간 생각이 멈췄다.평소 딕셔너리를 사용하긴했지만 key값와 value값을 자유자재로 사용하고 정렬하는 방법은 잘 몰랐기 때문이다.따라서 나의 노트에

velog.io

https://ctkim.tistory.com/entry/Python-%EC%9E%85%EB%AC%B8-%EA%B0%95%EC%A2%8C-12-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A7%91%ED%95%A9Set-%EC%A0%95%EB%A6%AC-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95

 

[Python 입문 강좌 - 12] 파이썬 집합(Set) 정리 및 사용법

더보기 ##파이썬 입문 목차 1. 파이썬 이란? 2-1. 파이썬 윈도우 설치 2-2. 파이썬 맥북 설치 2-3. 윈도우 파이썬 IDE 파이참 설치하기 2-4. 맥북 파이썬 IDE 파이참 설치하기 3. 파이썬 변수(Variable)의 정

ctkim.tistory.com

Comments