티스토리 뷰
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번의 연산이 이루어진다
링크
최근에 올라온 글
최근에 달린 댓글