Python 세트에서 세트 제거
내장형 5.7 Set Types에 대한 Python 2.7.2 문서에 대한 나의 해석에 따르면 , A를 set.remove(elem)또는 에 전달하여 집합 B에서 집합 A의 요소를 제거 할 수 있어야합니다.set.discard(elem)
2.7.2에 대한 문서에서 :
의에 ELEM 인수를 참고
__contains__(),remove()및discard()방법은 설정 될 수있다.
나는이를 통과 할 수 있음을 의미하는 것으로이 해석 set에 remove(elem)나 discard(elem)와 모든 요소가 목표 세트에서 제거됩니다. 나는 이것을 사용하여 문자열에서 모든 모음을 제거 하거나 단어 빈도 히스토그램에서 모든 일반적인 단어를 제거 하는 것과 같은 이상한 일을 할 것 입니다. 다음은 테스트 코드입니다.
Python 2.7.2 (default, Jun 12 2011, 14:24:46) [M...
Type "help", "copyright", "credits" or "license"
>>> a = set(range(10))
>>> b = set(range(5,10))
>>> a
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b
set([8, 9, 5, 6, 7])
>>> a.remove(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: set([8, 9, 5, 6, 7])
>>> a.discard(b)
>>> a
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>
내가 반환 할 것으로 예상되는 것 :
>>> a
set([0, 1, 2, 3, 4])
a.difference(b)새 세트를 반환하는 이 작업을 수행 할 수 있다는 것을 알고 있습니다 . 또는 함께 set.difference_update(other); 또는 집합 연산자 a -= b를 사용하여 그 자리에서 집합을 수정합니다.
그래서 이것은 문서의 버그입니까? set.remove(elem)실제로 집합을 인수로 사용할 수 없습니까 ? 아니면 문서가 세트 세트를 참조합니까? 그게 difference_update내 해석 을 완수 한 것을 감안할 때 , 나는 그 경우가 후자라고 생각합니다.
충분히 불분명합니까?
편집 3 년 동안의 추가 (일부 전문적인) 파이썬 작업 후 최근에이 질문으로 돌아와서 실제로 수행하려는 작업이 다음과 같이 수행 될 수 있음을 깨달았습니다.
>>> c = a.difference(b)
set([0,1,2,3,4])
이것이 제가 원래 얻으려고했던 것입니다.
편집 4 년 이상의 파이썬 개발 끝에 ... 나는이 작업이 세트 리터럴과 -연산자를 사용하여 더 깔끔하게 표현 될 수 있다는 것을 깨달았습니다 . 세트 차이가 비 교환적임을 보여주는 것이 더 완벽하다는 것을 알 수 있습니다.
>>> a={0,1,2,3}
>>> b={2,3,4,5}
>>> a-b
set([0, 1])
>>> b-a
set([4, 5])
이미 질문에 답하셨습니다. 집합 집합 (실제로 frozenset을 포함하는 집합)을 나타냅니다.
참조하는 단락은 다음으로 시작합니다.
참고로, __contains __ (), remove () 및 ignore () 메서드에 대한 elem 인수는 집합 일 수 있습니다.
이는 bin a.remove(b)이 집합이 될 수 있음 을 의미 하며 다음을 계속합니다.
동등한 frozenset 검색을 지원하기 위해 elem 세트는 검색 중에 일시적으로 변경된 다음 복원됩니다. 검색하는 동안 elem 집합은 의미있는 값이 없으므로 읽거나 변경해서는 안됩니다.
즉 b, 집합이면 해당되는 frozenset a.remove(b)을 검색 a하여 b제거합니다 (또는 KeyError존재하지 않는 경우 throw ).
a 는 변경 가능 하므로 Python에서 sets를 가질 수 없습니다 . 대신 s를 가질 수 있습니다 . 반면에, 당신은 호출 할 수 있습니다 , 그리고 A를 . 이 예를 참조하십시오.setsetsetfrozenset__contains__()remove()discard()set
a = set([frozenset([2])])
set([2]) in a # you get True
a.remove(set([2])) # a is now empty
따라서 귀하의 질문에 대한 대답은 문서가 sets of frozensets를 참조하고 있다는 것 입니다.
I'm looking at the built-in help for various versions of python (for mac). Here are the results.
- python2.5
remove(...)
Remove an element from a set; it must be a member.
If the element is not a member, raise a KeyError.
- python2.6
remove(...)
Remove an element from a set; it must be a member. If the element is not a member, raise a KeyError.
- python2.7
remove(...)
Remove an element from a set; it must be a member. If the element is not a member, raise a KeyError.
The documentation you refer to, in full, actually says:
Note, the elem argument to the
__contains__(),remove(), anddiscard()methods may be a set. To support searching for an equivalent frozenset, the elem set is temporarily mutated during the search and then restored.
This seems to be a footnote, that suggests the argument may be a set, but unless it finds a matching frozen set within the set, it will not be removed. The mention about the set being modified is so it can be hashed to look for a a matching frozen set.
I think the documentation is referring to sets of (frozen)sets, yes.
참고URL : https://stackoverflow.com/questions/9056833/python-remove-set-from-set
'IT TIP' 카테고리의 다른 글
| 스레드와 프로세스에 대해 이야기 할 때 "동시에 플로피를 포맷하지 마십시오"라는 주석이 왜 재미 있었습니까? (0) | 2020.11.28 |
|---|---|
| MVC 모델 개체, 도메인 개체 및 DTO의 차이점은 무엇입니까? (0) | 2020.11.28 |
| window.location이 변경되면 중단됩니까? (0) | 2020.11.28 |
| Startup.Configure에서 비동기 작업을 어떻게 처리합니까? (0) | 2020.11.28 |
| NGINX의 프록시 응답에서 URL을 어떻게 다시 작성합니까? (0) | 2020.11.27 |