«Очевидно, что я не могу это сделать, продолжая повторять исходный набор».
Я не уверен, что это правда ... Я ожидал ошибок «параллелизма», когда я его пробовал, но, похоже, не получил. Для записи кода, который я буду использовать, выглядит так:
for member in myset:
myset.remove(member)
(«член» лучший выбор имени переменной для множеств, «элемент» для списков)
Ах ... только что видели комментарий по доброй воле под ответом Zero P: очевидно, что я эксперт, где я болван, но я отправлю свой ответ в любом случае, просто чтобы привлечь внимание к точке ...
NB Zero P считает, что это утверждение в порядке с враждебностью ... но учитывая, что наборы, по дизайну, неупорядочены, я думаю, мы можем заключить, что ошибки параллелизма должны (и делать? в Python?) возникают только при удалении из n упорядоченная коллекция (т. list - и даже тогда вы можете использовать обратный индекс обратного индекса, чтобы избежать проблемы).
Было бы поэтому появляется, что отвращение к делеции-While-итерации этого дела суеверия и/или похмелья от негативного опыта от плохо реализованных структур на других языках.
Заключительная мысль: наборы и итерации не очень хорошо сочетаются друг с другом: поскольку набор неупорядочен, вы можете только когда-либо итерировать случайным образом по подмножеству всех членов (в частности, подмножество «все» или «сам», !). Наборы оптимизированы для тестов равенства и удаления дубликатов, и это отражает их предполагаемое использование. (? Идеальное решение)
Так эквивалентный бит кода к вышеупомянутому является:
while myset:
member = myset.pop()
# do something
ли операция * всегда * удалить элемент, или только иногда? Если вы всегда удаляете элемент, может быть проще просто очистить набор после завершения итерации. – Blckknght