집합(Set)
내용
집합(Set)의 특성과 생성
Set은 리스트, 튜플과 같이 여러 요소들을 그룹화하는 컬렉션(collection)이지만 사전형과 같이 요소들에 인덱스가 부여되지 않기 때문에 순서를 지정할 없습니다. 그러므로 인덱스를 사용하여 각 요소를 조작할 수 있는 시퀀스 객체가 아니지만 반복문 등으로 요소들을 하나씩 호출할 수 있으므로 이터러블(iterable) 객체 입니다. 다음 코드의 객체 x는 for 문을 사용하여 집합(set)의 각 요소를 하나씩 호출한 것입니다(시퀀스, 이터러블 참조).
x={1,2, 'python', 3} for i in x: print(i)
1 2 3 python
다음 코드는 다른 집합 객체 y에 대해 반복문을 사용하여 요소들 각각을 호출한 것입니다. 호출된 요소의 순서는 작성된 객체의 순서와 차이를 보입니다. 즉, set형의 요소들은 인덱스를 가지지 않으므로 순서를 특정할 수 없습니다. 그러므로 요소의 호출은 랜덤으로 이루어집니다.
y={3,4,5,6, "python", (1,2,3), "a", 'cd'}; set
{(1, 2, 3), 3, 4, 5, 6, 'a', 'cd', 'python'}
for i in y: print(i)
3 4 5 6 (1, 2, 3) python cd a
집합형 객체의 생성과 특성은 다음과 같습니다.
집합(set)
- Set는 순서가 없는 콜렉션입니다.
- 요소들을 중괄호({ })내에 포함시키거나 내장함수인
set()
클래스를 사용하여 생성합니다.- set() 클래스의 인수는 대괄호('[]'), 중괄호('{}'), 소괄호('()')로 그룹화하여 전달해야 합니다.
- 각 요소는 콤마(,)로 구별합니다.
- 집합형은 불변형이므로 가변형 객체인 리스트와 사전형은 집합의 요소가 될 수 없습니다. 이들을 제외한 정수, 실수, 문자, 그리고 튜플형 객체는 모두 요소가 될 수 있습니다.
- 집합형은 불변형이므로 요소를 수정할 수 없습니다. 그러나 객체 자체의 교환, 삭제는 가능합니다.
- 요소들의 중복은 허락되지 않습니다. 즉, 같은 요소들이 중복될 수 없습니다.
- 합집합(union), 교집합(intersection), 차집합(symmetric difference)등의 연산을 적용할 수 있습니다.
중괄호를 사용하여 생성합니다.
set1={1,2,3}; set1
{1, 2, 3}
set(x)
함수를 사용하여 생성합니다. 이 경우 인수 x는 요소 각각을 호출할 수 있는 이터러블이어야 합니다. 그러므로 다음 코드와 같이 숫자 리터럴은 이 함수의 인수가 될 수 없습니다.
set2=set(1); set2
TypeError: 'int' object is not iterable
set2=set(1,2,3); set2
TypeError: set expected at most 1 argument, got 3
숫자 리터럴을 요소로 하는 리스트, 튜플, 집합 형식으로 전환하여 입력하는 것으로 집합객체를 생성할 수 있습니다.
set2=set([1]) ;set2
{1}
set2=set([1,2,3]); set2
{1, 2, 3}
set2=set({1,2,3}); set2
{1, 2, 3}
set2=set((1,2,3)); set2
{1, 2, 3}
위 객체 set1과 같이 단순히 중괄호를 사용하여 생성할 수 있습니다.
s={1}; s
{1}
set1={3,4,5,6, "python", (1,2,3)} type(set1)
set
set1
{(1, 2, 3), 3, 4, 5, 6, 'python'}
문자 또는 문자열은 각 문자를 호출할 수 있으므로 이터러블이므로 set() 함수의 인수가 될 수 있습니다. 특히 다음 코드의 결과와 같이 문자열은 각각의 문자로 구성된 컬렉터이므로 각 문자가 집합형 객체의 요소가 됩니다. 이 경우 역시 집합에서는 요소의 순서를 정할 수 없으므로 요소로서 문자의 배열은 무작위로 나타납니다.
set("a")
{'a'}
set("python")
{'h', 'n', 'o', 'p', 't', 'y'}
집합형은 특정한 요소(들)을 호출할 수 없으므로 요소를 수정, 치환 할 수 있는 방법이 없습니다. 즉, 수정할 수 없는 불변(immutable) 객체입니다. 그러므로 가변 객체인 리스트, 사전은 집합의 요소가 될 수 없습니다.
a={3,4,5,6, "python", (1,2,3), {'two':2}}; a
~~TypeError: unhashable type: 'dict'
a={3,4,5,6, "python", (1,2,3), [10,20,30]}; a
~~TypeError: unhashable type: 'list'
집합형의 대표적인 메소드
첨가와 삭제
set의 요소들은 인덱스가 부여되지 않으므로 각각을 호출할 수 없으므로 원칙적으로 각 요소를 치환, 수정 등은 실행되지 않습니다. 그러나 set형에 적용되는 여러 메소드들을 사용하여 새로운 값들을 첨가하거나 삭제할 수 있습니다(표 1).
메서드 | 내용 |
---|---|
s.add() | set객체 s의 요소 하나를 첨가 |
s.update() | set객체 s의 여러 요소들을 첨가 인수로 리스트, 튜플, 문자열, set을 인수로 전달 |
remove() | 지정한 요소(들)을 삭제 객체가 포함하지 않은 요소(들)일 경우 에러를 발생 |
discard() | remove()와 같음 포함된 요소가 아닐 경우라도 에러를 발생시키지 않음 |
pop() | 요소 하나를 삭제 집합은 인덱스나 key가 없으므로 요소는 임의적으로 삭제 |
clear() | 객체의 모든 요소(들)을 삭제 객체 자체의 삭제가 아님 |
s=set({2,3}); s
{2, 3}
s.add(12); s
{2, 3, 12}
s.update(["apple", "python"]); s
{12, 2, 3, 'apple', 'python'}
set1={3,4,5,6, "python", (1,2,3)}; set1
{(1, 2, 3), 3, 4, 5, 6, 'python'}
set1.remove('python'); set1
{(1, 2, 3), 3, 4, 5, 6}
객체내의 요소를 제거하기 위한 메소드로 .remove()
와 .discard()
를 사용할 수 있습니다. .remove()의 경우 지정한 요소가 없을 경우는 에러를 발생하지만 .discard()의 경우는 에러를 발생하지 않는 차이를 보입니다.
set1.remove("python")
~~KeyError: 'python'
set1.discard('python'); set1
{(1, 2, 3), 3, 4, 5, 6}
set1.pop()
3
set1.pop()
4
set1
{(1, 2, 3), 5, 6}
set1.clear(); set1
set()
복사
리스트 객체의 복사에서 소개한 방식과 동일하게 이루어 집니다. 즉, .copy()
메소드를 사용하여 복사할 수 있으며 리터럴이나 객체 자체의 복사는 깊은 복사, 내재된 컬렉션의 요소(들)은 얕은 복사를 실행합니다.
할당연산자를 사용한 복사는 얕은 복사입니다.
a={1, 2, 3, 4, 5} b=a b is a
True
b == a
True
a.add(10) a
{1, 2, 3, 4, 5, 10}
b
{1, 2, 3, 4, 5, 10}
객체 a의 요소들은 모두 수치 리터럴입니다. 그러므로 .copy()
에 의한 복사는 깊은 복사가 이루어 집니다.
c=a.copy() c==a
True
c is a
False
집합(set) 연산
set 자료형은 합집합(union), 교집합(intersection), 차집합(difference), 그리고 여집합(symmetric difference)과 같은 연산을 위한 메소드들을 가지고 있습니다.
메서드 | 내용 |
---|---|
a.union(b) | 두 집합 a, b의 합집합을 반환 이 연산은 'or' 연산자인 '|'에 의해 수행 새로운 객체 생성 |
a.update(b) | a는 a|b의 결과로 치환 즉, a는 두 객체의 합으로 수정됨 |
A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} A.union(B)
{1, 2, 3, 4, 5, 6, 7, 8}
A|B
{1, 2, 3, 4, 5, 6, 7, 8}
A
{1, 2, 3, 4, 5}
A.update(B); A
{1, 2, 3, 4, 5, 6, 7, 8}
메서드 | 내용 |
---|---|
a.intersection(b) | a, b의 교집합 연산을 수행 '&' 연산자에 의해 같은 결과를 반환 새로운 객체 생성 |
a.intersection_update(b) | a는 a&b의 결과, 즉 교집합으로 치환 |
A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} A.intersection(B)
{4, 5}
A&B
{4, 5}
A
{1, 2, 3, 4, 5}
A.intersection_update(B); A
{4, 5}
메서드 | 내용 |
---|---|
a.difference(b) | a에만 존재하는 원소들을 반환(차집합) 연산자 "−"와 같음 새로운 객체 생성 |
a.difference_update(b) | a는 a − b의 결과로 치환됩니다. |
A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} A.difference(B)
{1, 2, 3}
A-B
{1, 2, 3}
A.difference_update(B); A
{1, 2, 3}
메서드 | 내용 |
---|---|
a.symmetric_difference(b) | a와 b의 여집합 연산자 ^와 같음. 새로운 객체 생성 |
a.symmetric_difference_update(b) | a는 a와 b의 여집합으로 치환됩니다. |
A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} A.symmetric_difference(B)
{1, 2, 3, 6, 7, 8}
(A|B)-(A&B)
{1, 2, 3, 6, 7, 8}
A.symmetric_difference_update(B); A
{1, 2, 3, 6, 7, 8}
메서드 | 내용 |
---|---|
a.isdisjoint(b) | a와 b의 교집합이 null이면 True 즉, 두 집합이 독립이면 True |
a.issubset(b) | a ⊂ b 이면 True |
a.issuperset(b) | a ⊃ b 이면 True |
A = {1, 2, 3, 4, 5} B = {1, 2, 3} C = {7,9} A.isdisjoint(B)
False
B.isdisjoint(C)
True
B.issubset(A)
True
A.issuperset(B)
True
댓글
댓글 쓰기