"Oczywiście, nie mogę tego zrobić, ciągle powtarzając cały zestaw."
Nie jestem pewien, czy to prawda ... Spodziewałem się błędów "współbieżności", gdy próbowałem, ale wydaje się, że nie ma żadnych. Dla przypomnienia: kod używam wygląda następująco:
for member in myset:
myset.remove(member)
(„członek” jest lepszym wyborem od nazwy zmiennej dla zbiorów; „Element” dla list)
Ach ... po prostu widziałem komentarz od uprzejmości pod odpowiedzią Zero P: najwyraźniej uprzejmie jest ekspertem, w którym jestem bumblerem, ale i tak opublikuję odpowiedź tylko po to, aby zwrócić uwagę na punkt ...
NB Zero P uznaje twierdzenie kindall, że jest w porządku z wrogością ... ale biorąc pod uwagę, że zestawy są, z założenia, nieuporządkowane, myślę, że możemy stwierdzić, że błędy współbieżności powinny (i czy? w Pythonie?) pojawiać się tylko wtedy, gdy usuwane są z n uporządkowana kolekcja (tj. lista - i nawet wtedy możesz użyć odliczania wstecznego indeksu, aby uniknąć problemu).
Byłoby zatem pojawiają że awersja do delecji-while-iteracji jest kwestią przesądów i/lub kaca od złych doświadczeń ze źle realizowanych strukturami w innych językach.
Ostateczna myśl: zestawy i iteracje naprawdę nie pasują do siebie strasznie dobrze: ponieważ zbiór jest nieuporządkowany, możesz tylko powtarzać w sposób losowy podzbiór wszystkich członków (w szczególności podzbiór "wszystko" lub "sam") !). Zestawy są zoptymalizowane pod kątem testów równości i duplikowania, co odzwierciedla ich zamierzone zastosowanie. (? Idealne rozwiązanie)
więc równoważny kawałek kodu do powyższego jest:
while myset:
member = myset.pop()
# do something
Czy operację * zawsze * usunąć element lub tylko czasami? Jeśli zawsze usuniesz przedmiot, łatwiej będzie opróżnić go po zakończeniu iteracji. – Blckknght