Python에서 집합 집합을 만들려면 어떻게해야합니까?


126

저는 파이썬으로 세트를 만들려고합니다. 어떻게해야할지 모르겠어요.

빈 세트로 시작 xx:

xx = set([])
# Now we have some other set, for example
elements = set([2,3,4])
xx.add(elements)

그러나 나는 얻는다

TypeError: unhashable type: 'list'

또는

TypeError: unhashable type: 'set'

파이썬에서 세트 세트를 가질 수 있습니까?

나는 대규모 세트 컬렉션을 다루고 있으며 중복 세트를 처리 할 필요가 없도록하고 싶습니다 (세트 B 세트 A1, A2, ....., An은 Ai = Aj 인 경우 두 세트를 "취소"합니다).

답변:


120

파이썬은 내부 set객체가 변경 가능하므로 해시 할 수 없기 때문에 불평합니다 . 해결책은 frozenset내부 세트 에 사용 하여 수정할 의도가 없음을 나타내는 것입니다.


59

사람들은 이미 frozenset () 으로이 작업을 수행 할 수 있다고 언급 했으므로이 작업을 수행 하는 방법에 대한 코드를 추가하겠습니다.

예를 들어 다음 목록 목록에서 집합 집합을 만들 수 있습니다.

t = [[], [1, 2], [5], [1, 2, 5], [1, 2, 3, 4], [1, 2, 3, 6]]

다음과 같은 방법으로 세트를 만들 수 있습니다.

t1 = set(frozenset(i) for i in t)

9
또는지도를 사용할 수 있습니다! set(map(frozenset, t))
Matt Dodge

18

frozenset내부에서 사용하십시오 .


9
아마도 그가 처음이기 때문에 파이썬에서 변경 가능 / 불변 객체에 대한 몇 가지 포인터를 줄 수 있습니까?
Seth Johnson

2
@Seth : 할 수 있지만 가변성은 요인이 아닙니다.
Ignacio Vazquez-Abrams

매우 감사합니다! 다시 읽기 : 이제 가변성. 목록 세트가 작동하는 것처럼 보이지만 frozenset이 완료하는 것 같습니다. 다시 한 번 감사드립니다!
Matt

@Ignacio 저는 딕셔너리의 세트와 키의 멤버가 해시 가능해야하므로 변경할 수 없다고 생각했습니다.
Seth Johnson

7
해시 가능성과 변경 가능성이 반드시 상호 배타적 인 것은 아닙니다. 대부분의 기본 Python 유형은 패턴을 공유합니다.
Ignacio Vazquez-Abrams

3

그래서 똑같은 문제가있었습니다. 세트로 작동하는 데이터 구조를 만들고 싶었습니다. 문제는 세트가 불변 객체 를 포함해야한다는 것 입니다. 따라서 할 수있는 일은 단순히 튜플 세트로 만드는 것입니다. 그것은 나를 위해 잘 작동했습니다!

A = set()
A.add( (2,3,4) )##adds the element
A.add( (2,3,4) )##does not add the same element
A.add( (2,3,5) )##adds the element, because it is different!

22
튜플에서는 요소 순서가 중요합니다. 따라서 A.add( (4,3,2)); A.add((2,4,3)); A.add((2,3,4))원래의 질문이 있음을 의미한다 "세트 세트"에 대해있는 동안, 세 가지 요소를 추가합니다 (2,3,4), (4,3,2), (2,4,3)동일합니다.
Boris Gorelik 2017

1

2020 년부터 공식 Python 문서frozenset 는 집합 집합을 나타내는 데 사용 하도록 권장 합니다.


1
Wow 이것은 PEP 416 (냉동 사전)이 채택되지 않았고 2012 년에 제안 되었기 때문에 매우 흥미 롭습니다.
NikoNyrh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.