문제의 역사:
타입 set (집합)은 Python 2.4에 추가되었으며 독특하고 변경 불가능한 요소를 저장하는 간편하고 빠른 방법을 제공하며 집합 이론적 작업(합집합, 교집합 등)을 지원합니다. 집합은 해시 테이블을 기반으로 구현됩니다.
문제: 많은 사용자들은 set과 list의 차이, set에 요소를 저장하는 특징(비순서성, 해시 가능 객체만 가능)에 대한 이해가 부족하며, 검색 최적화, 고유성 검사 또는 대량 데이터 세트 작업을 위한 집합 사용 시의 뉘앙스도 잘 알지 못합니다.
해결책:
Set은 변경 가능하고 비순서가 있는 고유 해시 가능 객체의 컨테이너입니다. 포함 여부 확인, 합집합, 교집합, 차집합 및 대칭 차집합과 같은 빠른 작업을 지원합니다. 내장 메서드: add, remove, discard, update, intersection, difference, union, symmetric_difference 등.
코드 예시:
nums = {1, 3, 5, 7} nums.add(9) nums.update([5, 10]) # 5는 이미 존재하므로 10만 추가됨 other = {3, 9, 11} inter = nums & other # 교집합 {3, 9} # 포함 여부 체크 - list보다 빠름 y = 11 if y in nums: print('있습니다!')
주요 특징:
in 연산은 놀라울 정도로 빠르며 (평균 O(1)), 리스트에 비해 O(n)입니다.리스트나 다른 set을 set에 추가할 수 있습니까?
답변: 아니요, 불가능합니다. 오직 해시 가능(변경 불가능한) 객체만 허용됩니다: 문자열, 숫자, 튜플. 리스트와 집합은 변경 가능하므로 추가할 수 없습니다.
코드 예시:
s = set() s.add([1, 2]) # TypeError: unhashable type: 'list' s.add((1, 2)) # OK
remove 메서드와 discard 메서드는 set에서 어떻게 다릅니까?
답변: remove(value)는 value가 없으면 KeyError를 발생시킵니다. discard(value)는 그런 요소가 없으면 조용히 아무것도 하지 않습니다.
코드 예시:
s = {1, 2, 3} s.remove(4) # KeyError s.discard(4) # 오류 없음
빈 집합 {}은 set 객체인가요?
답변: 아니요. 리터럴 {}는 항상 빈 dict입니다. 빈 set을 만들려면 set() 함수를 사용해야 합니다.
코드 예시:
empty_set = {} # 이것은 dict empty_set_real = set() # 이것은 set
부정적 사례
고유한 객체를 리스트에 저장하고 "in"을 통해 중복을 찾으려는 시도입니다.
장점:
단점:
긍정적 사례
대량의 배열(예: 이메일 발송 목록)에서 교차 및 고유 데이터를 찾기 위해 set을 사용하여 중복이 발생하지 않고 작업이 빠르게 진행됩니다.
장점:
단점: