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.