04-4 집합

윤혜민·박현규 · 19 / 30

리스트, 튜플, 딕셔너리를 지나 집합에 도착했습니다. 집합은 우리가 수학 시간에 배운 개념을 그대로 가져온 자료형입니다. 집합은 중복 없이 데이터를 묶어 관리하고 싶을 때 사용합니다. 사실 집합은 길게 이야기할 내용이 없습니다. 자료형의 특징만 이해하고 적절하게 사용하면 됩니다.

집합의 기초 연습하기

예를 들어 여러분이 어떤 데이터를 관리하려고 할 때 중복을 원하지 않는다면 어떻게 해야 할까요? 바로 집합을 사용하면 됩니다. 집합은 앞에서 배운 여러 데이터를 묶는 자료형들을 set( )에 넣어 만들 수 있습니다.

리스트로 집합 만들기

다음은 리스트를 집합으로 만드는 코드입니다. 중복을 제거한다는 특징을 보기 위해 리스트에는 중복 요소를 일부러 넣었습니다.

numbers = [1, 2, 2, 3, 3, 3, 4, 5]
unique_numbers = set(numbers)
print(unique_numbers)

[실행 결과]

{1, 2, 3, 4, 5}

실행 결과를 보면 리스트에 있던 중복 요소가 모두 사라지고 대괄호로 감쌌던 내용이 중괄호로 바뀌었습니다. 이처럼 집합으로 전환한 데이터는 중괄호로 감싸 표현합니다.

튜플로 집합 만들기

튜플을 set( )에 넣어도 집합을 만들 수 있습니다. 다만 여기서 중요한 사실이 하나 있습니다. 집합은 순서를 신경쓰지 않는다는 점입니다. 다음 코드를 실행해보면 지금 이야기한 '순서를 신경쓰지 않음'의 의미를 명확하게 알 수 있습니다.

colors_tuple = ("red", "blue", "red", "green", "blue", "yellow")
colors_set = set(colors_tuple)
print(f"원본 튜플: {colors_tuple}")
print(f"집합 변환: {colors_set}")

[실행 결과]

원본 튜플: ('red', 'blue', 'red', 'green', 'blue', 'yellow')

집합 변환: {'yellow', 'blue', 'green', 'red'}

실행 결과를 보면 튜플에 있던 중복된 "red"와 "blue"가 하나씩만 남았고, 순서도 원본이었던 튜플과 달라진 것을 확인할 수 있습니다. 집합은 순서를 보장하지 않기 때문에 출력할 때마다 요소의 순서가 달라질 수 있습니다.

딕셔너리로 집합 만들기

딕셔너리도 set( )에 전달하여 집합으로 만들 수 있지만 딕셔너리는 키만 집합화의 대상이 됩니다. 그래서 다음과 같이 코드를 입력하면 딕셔너리의 값은 사라지고 키만 남습니다.

student = {"name": "김철수", "age": 20, "major": "컴퓨터공학"}
keys_set = set(student)
print(keys_set)

[실행 결과]

{'name', 'age', 'major'}

물론 값을 집합화하고 싶다면 student.values( )와 같이 값을 따로 뽑아 집합화하면 됩니다.

student = {"name": "김철수", "age": 20, "major": "컴퓨터공학", "age2": 20}
values_set = set(student.values())
print(values_set)

[실행 결과]

{'김철수', 20, '컴퓨터공학'}

딕셔너리는 중복 키가 있을 확률은 없습니다. 딕셔너리의 이름에서 유추할 수 있듯이 딕셔너리는 ‘사전’을 본따 만든 것입니다. 그래서 키는 중복할 수 없습니다. 그래서 결론은 딕셔너리는 집합화할 수 있지만 애초에 키는 중복되지 않으므로 사실은 딕셔너리로 집합을 만드

집합 응용 연습하기

집합을 사용할 때 실용적인 예를 하나 공부하면서 빠르게 마무리하겠습니다. 예를 들어 여러분이 수집한 데이터가 사용자 설문조사 데이터인데 '어떤 과일을 좋아하는지?'에 대한 질답이 있다고 하면 가장 먼저 파악해야 할 내용은 답변한 과일의 종류나 가짓수입니다. 그럴 때 집합이 유용합니다. 다음 코드를 작성해 중복 제거의 묘미를 느껴봅시다.

# 설문조사에서 응답자들이 좋아하는 과일을 수집했습니다
responses = ["사과", "바나나", "사과", "오렌지", "바나나", "사과", "포도", "오렌지", "바나나"]
print(f"전체 응답 수: {len(responses)}")
print(f"응답 내역: {responses}")
# 중복을 제거하여 어떤 종류의 과일이 언급되었는지 확인
unique_fruits = set(responses)
print(f"\n언급된 과일 종류: {unique_fruits}")
print(f"과일 종류 개수: {len(unique_fruits)}")

[실행 결과]

전체 응답 수: 9

응답 내역: ['사과', '바나나', '사과', '오렌지', '바나나', '사과', '포도', '오렌지', '바나나']

언급된 과일 종류: {'바나나', '포도', '사과', '오렌지'}

과일 종류 개수: 4

9개의 응답이 있었지만 실제로는 4종류의 과일만 언급된 것을 집합을 통해 금방 알아냈습니다. 이처럼 집합은 중복을 제거하는데 탁월합니다.