728x90
반응형
집합 이전 내용
집합(set) 보완
[집합 특징 요약]
- 집합은 순서가 없는 자료형
- 집합은 중복을 허용하지 않음 (리스트는 중복 허용하며 순서가 있음)
- 집합은 인덱스로 꺼낼 수 없으나, 원소로 꺼내올 수 있다.
- len: 집합 길이 연산
- max: 집합 원소 중 최댓값
- min: 집합 원소 중 최솟값
- sorted: 원소 정렬하기
- add: 원소 추가하기
- remove: 원소 삭제하기
- 리스트 내포 시에는 {} 로 묶고 그 안에 리스트 내포 반복문 문법 사용하면 된다.
- 부분집합: < 또는 issubseet
- 교집합: | 또는 union
- 합집합: & 또는 intersection
- 차집합: - 또는 difference
관련 코드 및 예제
# set: 집합 {}
# 특징1: 순서가 없는 자료형. 특징2: 중복을 허용하지 않음.
# 특징3: set은 인덱스로 꺼낼 수 없다
# 리스트는 중복을 허용하며 순서가 있는 자료형
num_set = set(range(1, 11))
print(num_set) # {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
values = set()
print(values) # set()
# 중복을 허용하지 않음. (딕셔너리의 키와 비슷)
numbers = set([1,2,3,1,2,3])
print(numbers) # {1, 2, 3}
# set은 인덱스로 꺼낼 수 없다.
# numbers[0]
# 대신에 원소로 꺼내올 수 있다
num1, num2, num3 = numbers
print(num1, num2, num3) # 1 2 3
letters = set("abcd")
print(letters) # {'a', 'd', 'c', 'b'}
# 세트 연산
# all, any, enumerate, len, max, min, sorted, sum
# 집합 길이 연산
fruits = {"apple", "banana", "kiwi", "mango", "melon"}
size = len(fruits)
print(f"과일은 모두 {size}가지 있습니다.") # 과일은 모두 5가지 있습니다.
# 집합 + 조건문
want_fruit = "banana"
if want_fruit in fruits:
print(f"{want_fruit}이(가) 있습니다.") # banana이(가) 있습니다.
for x in fruits:
print(x, end=" ") # 순서가 없으므로 실행 시마다 순서가 다르다
print()
# 정렬하기
for x in sorted(fruits):
print(x, end=" ")
print() # apple banana kiwi mango melon
# 요소 추가하기(add)
fruits.add("pear")
# fruits.add("orange", "grape") > 한 번에 2개 이상은 추가 불가
print(fruits) # {'apple', 'melon', 'mango', 'banana', 'kiwi', 'pear'}
# 요소 삭제하기(remove)
fruits.remove("mango")
print(fruits) # {'apple', 'melon', 'banana', 'kiwi', 'pear'}
# 리스트 내포 : fruits 중 5글자 이상만 출력하기
result = {x for x in fruits if len(x) >= 5}
print(result) # {'apple', 'banana', 'melon'}
# 리스트 내포 사용하여 짝수만 출력되게 (집합으로)
aList = [1, 2, 3, 4, 5, 1, 2, 3]
result_a = {x for x in aList if x % 2 == 0}
print(result_a) # {2, 4}
aset = set(aList)
print(aset) # {1, 2, 3, 4, 5}
# 부분 집합
if result_a < aset:
print('result_a는 aset의 부분집합입니다.')
else:
print('result_a는 aset의 부분집합이 아닙니다.')
# 합집합
union_set = result_a | aset
print(f"합집합: {union_set}")
# 교집합
inter_set = result_a & aset
print(f"교집합: {inter_set}")
# 차집합
diff_set = aset - result_a
print(f"차집합: {diff_set}")
# 부분 집합 (< 또는 issubseet)
A = {'apple', 'melon', 'banana', 'kiwi', 'pear'}
B = {'apple', 'melon', 'kiwi', 'pear'}
if A < B:
print("A는 B의 부분집합입니다.")
elif A > B:
print("B는 A의 부분집합입니다.") # B는 A의 부분집합입니다.
else:
print("부분집합이 아닙니다.")
# 합집합 (| 또는 union)
a_union_b = A.union(B)
print(a_union_b) # {'kiwi', 'banana', 'apple', 'melon', 'pear'}
# 교집합 ( & 또는 intersection)
a_inter_b = A.intersection(B)
print(a_inter_b) # {'apple', 'melon', 'kiwi', 'pear'}
# 차집합( - 또는 difference)
a_diff_b = A.difference(B)
print(a_diff_b) # {'banana'}
중복된 글자를 찾고자 할 경우엔 문자형, 리스트 등을 받은 뒤 set(해당 자료형)을 통해 집합으로 변환한 후 교집합을 통해 중복 글자만 남긴 후 반복문을 통해 출력시키면 된다.
해당 코드
# Q. 공통 문자 찾기(공백 제외)
str_1 = input("문장을 입력해 주세요: ")
str_2 = input("문장을 입력해 주세요: ")
str_set1 = set(str_1)
str_set2 = set(str_2)
str_set3 = set(" ")
union_str = (str_set1 & str_set2) - str_set3
print(union_str)
# for 반복문 써서 해보기
total_str = str_set1 & str_set2
total_str.remove(" ")
print(total_str)
# set_a.remove(" ") - 공백 제거
for i in total_str:
if i != " ":
print(i , end=" ")
print()
# 리스트 내포
result_str = {x for x in union_str}
print(result_str)
마찬가지로, 긴 문장의 각 단어의 출력 수 역시 먼저 split을 통해 공백을 기준으로 단어를 나눈 후, 집합으로 변환하여 중복된 단어를 제거한 뒤,각 원소의 개수를 체크하면 된다.
관련 예제 및 코드
txt = input("메시지를 입력하세요: ")
words = txt.split(" ") # 공백일 경우 () 가능
aSet = set(words)
print(f"단어수: {len(aSet)}") # 17
다음 내용
728x90
반응형
'[파이썬 Projects] > <파이썬 기초>' 카테고리의 다른 글
[파이썬] 파이썬 기초 - 딕셔너리 보완 (0) | 2025.01.21 |
---|---|
[파이썬] 파이썬 기초 - 전화번호부 만들기 (0) | 2025.01.17 |
[파이썬] 파이썬 기초: 파일 읽고 쓰기 (보완) (0) | 2025.01.16 |
[파이썬] 파이썬 기초: 다양한 출력 포맷 (0) | 2025.01.15 |
[파이썬] 파이썬 기초 - 랜덤 모듈 (0) | 2025.01.15 |