비순서 자료구조(None-Sequence Data Structure)

2023. 3. 2. 13:56Python/실전 예제로 배우는 파이썬 프로그래밍

셋(set)

set 클래스는 여러 개의 자료를 비 순서로 적재하는 가변 길이 비순차 자료구조를 생성하는 클래스입니다.

 

(1) 셋 객체 특징 

□ 비순서 자료구조를 갖는 열거형 객체를 생성할 수 있습니다.

□ 다음 형식과 같이 중괄호({})안에 콤마(,)를 이용하여 원소를 구분합니다.

 

형식

변수 = {값1, 값2, .... 값n}

□ 중복을 허용하지 않습니다.

□ 순서가 없기 때문에 색인(index)을 사용할 수 없습니다.

□ 객체에서 제공하는 함수를 이용하여 추가, 삭제 및 집합 연산 등이 가능합니다.

 

실습 셋 객체 예시

# (1) 중복 불가
s = {1, 3, 5, 3, 1}
print(len(s))
print(s)

3

# (2) 요소 반복
for d in s:
	print(d, end=' ')	# 1 3 5
print()

{1, 3, 5}

# (3) 집합관련 함수
s2 = {3, 6}
print(s.union(s2))	# 합집합
print(s.difference(s2))	# 차집합
print(s.intersection(s2))	# 교집합

{1, 3, 5, 6}
{1, 5}
{3}

# (4) 추가, 삭제 함수
s3 = {1, 3, 5}
print(s3)

{1, 3, 5}

s3.add(7)	# 원소 추가
print(s3)

{1, 3, 5, 7}

s3.discard(3)	# 원소 삭제
print(s3)

{1, 5, 7}

# (1) 중복 불가

변수 s는 5개의 원소 중에서 4번째 원소 3은 이미지 2번째에서 출현하기에 중복되어 저장되지 않습니다.

 

# (2) 요소 반복

셋은 색인을 사용할 수 없지만 for문에서 요소 반복으로 사용할 수 있습니다.

 

# (3) 집합관련 함수

변수 s와 s2 간의 합집합(union), 차집합(difference), 교집합(intersection) 연산이 관련 함수들에 의해서 수행됩니다.

 

# (4) 추가, 삭제 함수

셋 객체에서 집합의 원소를 추가 및 삭제할 수 있으며, 추가는 add(원소), 삭제는 discard(원소) 함수를 이용합니다.

 

(2) 중복 제거

중복을 허용하지 않는다는 셋의 특징을 이용하여 리스트의 중복 원소를 제거하는데 셋을 이용할 수 있습니다.

 

실습 중복 제거 예시

# 중복 원소를 갖는 리스트
gender = ['남', '여', '남', '여']

# 중복 원소 제거
sgender = set(gender)	# list -> set
lgender = list(sgender)
print(lgender)

print(lgender[1])

['남', '여']

여

딕트(dict)

dict 클래스는 사전(dictionary) 형으로 여러 개의 자료를 비 순서로 적재하는 가변 길이 비순차 자료 구조를 생성하는 클래스입니다.

 

(1) 딕트 객체 특징

□ 사전 형식으로 비순서 자료구조를 갖는 열거형객체를 생성할 수 있습니다.

□ 다음 형식과 같이 중괄호 안에 ['키':'값']의 쌍으로 원소를 입력하고, 콤마(,)를 이용하여 원소를 구분합니다.

 

형식

변수 = {'키' : '값', '키' : '값, .... '키' : '값'

□ '키'는 중복이 허용되지 않고, '값'은 중복이 허용됩니다.

□ 색인(index) 대신에 키(key)를 이용해서 '값'을 참조합니다.

□ 키를 색인으로 이용될 수 있기 때문에 원소 수정, 삭제, 추가 등이 가능합니다.

 

실습 딕트 객체 예시

# (1) dict 생성 방법1
dic = dict(key1 = 100, key2 = 200, key3 = 300)
print(dic)

{'key1': 100, 'key2': 200, 'key3': 300}

# (2) dict 생성 방법2
person = {'name': '홍길동', 'age': 35, 'address': '서울시'}
print(person)
print(person['name'])
print(type(dic), type(person))

{'name': '홍길동', 'age': 35, 'address': '서울시'}
홍길동
<class 'dict'> <class 'dict'>

# (3) 원소 수정, 삭제, 추가
# dict 원소 수정
person['age'] = 45
print(person)

{'name': '홍길동', 'age': 45, 'address': '서울시'}

# dict 원소 삭제
del person['address']
print(person)	# {'name': '홍길동', 'age': 45}

{'name': '홍길동', 'age': 45}

# dict 원소 추가
person['pay'] = 350
print(person)	# {'name': '홍길동', 'age': 45, 'pay': 350}

{'name': '홍길동', 'age': 45, 'pay': 350}

# (1) dict 생성 방법1

dict 클래스에서 '키=값' 형식의 인수를 이용하여 딕트 객체를 생성할 수 있습니다.

 

# (2) dict 생성 방법 2

중괄호 기호 안에 '{키 : 값}' 형식으로 딕트 객체를 생성할 수 있습니다. person 변수는 3개의 원소를 갖는 딕트 객체입니다.

 

# (3) 원소 수정, 삭제, 추가

딕트는 키를 색인으로 이용할 수 있기에 원소의 수정, 삭제, 추가가 가능합니다.

 

(2) 요소 검사와 반복

딕트는 셋과 같이 비순서 자료구조이지만 열거형 객체이기에 요소 검사와 요소 반복 기능을 지원합니다.

 

실습 요소 검사와 반복 예시

# (1) 요소 검사
print(person['age'])	# 45
print('age' in person)	# True

45
True

# (2) 요소 반복
for key in person.keys() :	# key 넘김
	print(key)	# key 출력
    
name
age
pay

for v in person.values() :	# value 넘김
	print(v)	# value 출력

홍길동
45
350

for i in person.items() :	# (key, value) 넘김
	print(i)	# ('name', '홍길동')

('name', '홍길동')
('age', 45)
('pay', 350)

# (1) 요소 검사

딕트의 요소를 검사하기 위해서 '요소 in 딕트객체' 형식으로 in 앞부분에 검사할 요소를 넣습니다.

 

# (2) 요소 반복

딕트 객체는 for문에서 요소 반복으로 사용할 수 있습니다.

 

(3) 단어 출현빈도수 구하기

 

실습 단어 빈도수 구하기 예시

# (1) 단어 데이터 셋
charset = ['abc', 'code', 'band', 'band', 'abc']
wc = {}	# 빈 셋

# (2) get() 함수 이용 : key 이용 value 가져오기
for key in charset :
	wc[key] = wc.get(key, 0) + 1	# get() 이용
print(wc)

{'abc': 2, 'code': 1, 'band': 2}

# (1) 단어 데이터 셋

charset 리스트 객체는 중복된 5개의 단어를 원소로 가집니다.

 

# (2) get() 함수 이용

charset 리스트 객체를 for문의 요소 반복으로 사용하여 순차적으로 단어를 하나씩 key 변수로 넘겨받습니다.