티스토리 뷰

Python

python set 자료형 사용 방법

workcoding 2025. 4. 18. 16:00

 

python set 자료형

 

python에는 set 자료형이 있다.

# set자료형 사용 방법
ImSet = {1, 2, 3}
ImSet2 = set()

 

 

set 자료형은 중복 제거, 인덱스 없음, 그리고 해시 테이블을 기반으로 한다.

여러 데이터를 처리할 때, list나 dictionary를 사용하면 대부분 구현할 수 있다.

그동안 set는 중복 제거를 위해서만 사용했었는대 성능면에서 차이가 꽤 많이 발생한다.

# 중복 제거
sample = [1, 1, 2, 2, 3]
sample = set(sample)
print(sample)
# {1,2,3}

 

A, B 두 개의 리스트가 주어졌을 때,

A에 포함되는 B의 요소를 찾는다면 in 연산자를 사용해서 찾아낼 수 있다.

 

numbers = list(map(int, input().split()))
target_numbers = list(map(int, input().split()))

match_numbers = []
for target in target_numbers:
	if target in numbers:
    	match_numbers.append(target)

print(match_numbers)

 

다만, 위의 코드는 연산 회수가 numbers의 길이와 target_numbers의 길이를 모두 검사한다.

len(numbers) = 100

len(target_numbers) = 100

연산 회수 = 100 x 100 = 10000

 

아래는 검색해야 하는 list A를 set로 변환하였을 경우이다.

numbers = set(map(int, input().split()))
target_numbers = list(map(int, input().split()))

match_numbers = []
for target in target_numbers:
	if target in numbers:
    	match_numbers.append(target)

print(match_numbers)

 

 

set 자료형으로 변환하였을 경우 numbers에서 target을 찾는 in 연산자에서 해시값을 이용해 직접 접근하게 된다.

len(numbers) = 100

len(target_numbers) = 100

연산 회수 = 100 + 100 = 200

 

연산 회수의 차이가 나는 이유를 풀어서 설명한다면

리스트와 리스트를 비교하는 경우

# 길이 10 리스트
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 길이 10 리스트 (일치 항목은 5)
target_numbers = [100, 30, 5, 12, 13, 14, 15, 16, 20, 22]

match_numbers = []
for target in target_numbers:
	if target in numbers:
    	match_numbers.append(target)
        

# numbers의 요소를 하나씩 들고와서 확인 해본다
100(target) in numbers[0] == false
100(target) in numbers[1] == false
100(target) in numbers[2] == false
...

5(target) in numbers[0] == false
5(target) in numbers[1] == false
5(target) in numbers[2] == false
5(target) in numbers[3] == false
5(target) in numbers[4] == true

match_numbers.append(5)

# 위와 같이 모든 리스트 요소를 순환하기 때문에 10(for문) x 10(if문) = 100번의 연산이 이루어진다

 

세트와 리스트를 비교하는 경우

# 길이 10 세트
numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

# 길이 10 리스트 (일치 항목은 5)
target_numbers = [100, 30, 5, 12, 13, 14, 15, 16, 20, 22]

match_numbers = []
for target in target_numbers:
	if target in numbers:
    	match_numbers.append(target)
        

# numbers의 요소를 hash table에서 확인
100(target) in numbers == false

# 100 이라는 요소를 해시 테이블에서 같은 것이 있는 지 확인
# dictionary의 key를 입력해서 value를 찾는 것과 유사하지만
# set의 경우 key를 입력해서 key를 가져옴

5(target) in numbers == true
match_numbers.append(5)

# 위와 같이 in 연산에서 한번의 비교만 일어난다. 10(for문) + 10(if문) = 20번의 연산이 이루어진다
링크
최근에 올라온 글
최근에 달린 댓글