Согласно моей интерпретации документации Python 2.7.2 для встроенных типов 5.7 Set Types, должно быть возможно удалить элементы установите A из множества B, передав A на set.remove(elem)
или 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)
, который возвращает новый набор; или с a set.difference_update(other)
; или с операторами-операторами a -= b
, которые изменяют набор на месте.
Так это ошибка в документации? Может ли set.remove(elem)
фактически не принимать набор в качестве аргумента? Или документация относится к наборам наборов? Учитывая, что difference_update
выполняет мою интерпретацию, я предполагаю, что дело в последнем.
Это недостаточно ясно?
ИЗМЕНИТЬ После 3 лет дополнительной (некоторой профессиональной) работы python и недавно обратившись к этому вопросу, я понимаю, что то, что я на самом деле пытаюсь сделать, может быть достигнуто с помощью:
>>> c = a.difference(b)
set([0,1,2,3,4])
из-за которого я изначально пытался получить.