IT TIP

Python 세트에서 세트 제거

itqueen 2020. 11. 28. 13:21
반응형

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()방법은 설정 될 수있다.

나는이를 통과 할 수 있음을 의미하는 것으로이 해석 setremove(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(), and discard() 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

반응형