Согласно моей интерпретации документации Python 2.7.2 для Built-In Types 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 "", line 1, in
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
выполняет мою интерпретацию, я предполагаю, что дело обстоит именно так.
Это достаточно неясно?
EDIT После 3 лет дополнительной (несколько профессиональной) работы с python, и будучи недавно привлеченным обратно к этому вопросу, я понял, что теперь то, что я на самом деле пытался сделать, может быть достигнуто с помощью:
>>> c = a.difference(b)
set([0,1,2,3,4])
что и было тем, что я изначально пытался получить.
EDIT.
После еще 4 лет разработки на python... Я понял, что эту операцию можно выразить более чисто, используя литералы множеств и оператор -
; и что более полно показать, что разность множеств некоммутативна.
>>> a={0,1,2,3}
>>> b={2,3,4,5}
>>> a-b
set([0, 1])
>>> b-a
set([4, 5])