TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 기초>

[파이썬] 파이썬 기초 - 집합 (set) 보완

by 기록자_Recordian 2025. 1. 20.
728x90
반응형
집합 이전 내용
 

[파이썬] 파이썬기초: 자료형 - 집합 자료형

시작에 앞서해당 내용은 ' 박응용 지음. 이지스 퍼블리싱' 을 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다. 자료형 자료형이란

puppy-foot-it.tistory.com


집합(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
반응형