@@ -72,13 +72,13 @@ def __and__(self, other: set[str], /) -> set[str]:
72
72
def __contains__ (self , item : str , / ) -> bool :
73
73
return item in self ._set
74
74
75
- def __delitem__ (self , key : int , / ) -> None :
75
+ def __delitem__ (self , index : int , / ) -> None :
76
76
warnings .warn (
77
77
"Using block level elements as a list is deprecated, use it as a set instead." ,
78
78
DeprecationWarning ,
79
79
)
80
- element = self ._list [key ]
81
- del self ._list [key ]
80
+ element = self ._list [index ]
81
+ del self ._list [index ]
82
82
self ._set .remove (element )
83
83
84
84
def __getitem__ (self , index : int , / ) -> str :
@@ -100,16 +100,16 @@ def __iadd__(self, other: list[str], /) -> set[str]:
100
100
101
101
def __iand__ (self , other : set [str ], / ) -> set [str ]:
102
102
# In-place intersection should update both list and set.
103
- self ._list = [element for element in self ._list if element in other ]
104
103
self ._set &= other
104
+ # Elements were only removed.
105
+ self ._list [:] = [element for element in self ._list if element in self ._set ]
105
106
return self # type: ignore[return-value]
106
107
107
108
def __ior__ (self , other : set [str ], / ) -> set [str ]:
108
109
# In-place union should update both list and set.
109
- for element in other :
110
- if element not in self ._set :
111
- self ._list .append (element )
112
110
self ._set |= other
111
+ # Elements were only added.
112
+ self ._list .extend (element for element in sorted (self ._set - set (self ._list )))
113
113
return self # type: ignore[return-value]
114
114
115
115
def __iter__ (self ) -> Iterator [str ]:
@@ -155,14 +155,14 @@ def __reversed__(self) -> Iterator[str]:
155
155
)
156
156
return reversed (self ._list )
157
157
158
- def __setitem__ (self , key : int , value : str , / ) -> None :
158
+ def __setitem__ (self , index : int , value : str , / ) -> None :
159
159
warnings .warn (
160
160
"Using block level elements as a list is deprecated, use it as a set instead." ,
161
161
DeprecationWarning ,
162
162
)
163
163
# In-place item-setting should update both list and set.
164
- old = self ._list [key ]
165
- self ._list [key ] = value
164
+ old = self ._list [index ]
165
+ self ._list [index ] = value
166
166
self ._set .discard (old )
167
167
self ._set .add (value )
168
168
@@ -207,27 +207,24 @@ def difference(self, *others: set[str]) -> set[str]:
207
207
def difference_update (self , * others : set [str ]) -> None :
208
208
# In-place difference should update both list and set.
209
209
self ._set .difference_update (* others )
210
- self . _list . clear ()
211
- self ._list . extend ( sorted ( self ._set ))
210
+ # Elements were only removed.
211
+ self ._list [:] = [ element for element in self . _list if element in self ._set ]
212
212
213
213
def discard (self , element : str , / ) -> None :
214
214
# In-place discard should update both list and set.
215
215
self ._set .discard (element )
216
- while True :
217
- try :
218
- self ._list .remove (element )
219
- except ValueError :
220
- break
216
+ try :
217
+ self ._list .remove (element )
218
+ except ValueError :
219
+ pass
221
220
222
221
def extend (self , elements : list [str ], / ) -> None :
223
222
warnings .warn (
224
223
"Using block level elements as a list is deprecated, use it as a set instead." ,
225
224
DeprecationWarning ,
226
225
)
227
226
# In-place extension should update both list and set.
228
- for element in elements :
229
- if element not in self ._list :
230
- self ._list .append (element )
227
+ self ._list .extend (elements )
231
228
self ._set .update (elements )
232
229
233
230
def index (self , value , start : int = 0 , stop : int = sys .maxsize , / ):
@@ -253,8 +250,8 @@ def intersection(self, *others: set[str]) -> set[str]:
253
250
def intersection_update (self , * others : set [str ]) -> None :
254
251
# In-place intersection should update both list and set.
255
252
self ._set .intersection_update (* others )
256
- self . _list . clear ()
257
- self ._list . extend ( sorted ( self ._set ))
253
+ # Elements were only removed.
254
+ self ._list [:] = [ element for element in self . _list if element in self ._set ]
258
255
259
256
def isdisjoint (self , other : set [str ], / ) -> bool :
260
257
return self ._set .isdisjoint (other )
@@ -297,8 +294,9 @@ def symmetric_difference(self, other: set[str], /) -> set[str]:
297
294
def symmetric_difference_update (self , other : set [str ], / ) -> None :
298
295
# In-place symmetric difference should update both list and set.
299
296
self ._set .symmetric_difference_update (other )
300
- self ._list .clear ()
301
- self ._list .extend (sorted (self ._set ))
297
+ # Elements were both removed and added.
298
+ self ._list [:] = [element for element in self ._list if element in self ._set ]
299
+ self ._list .extend (element for element in sorted (self ._set - set (self ._list )))
302
300
303
301
def union (self , * others : set [str ]) -> set [str ]:
304
302
# User expects a set back.
@@ -307,8 +305,8 @@ def union(self, *others: set[str]) -> set[str]:
307
305
def update (self , * others : set [str ]) -> None :
308
306
# In-place union should update both list and set.
309
307
self ._set .update (* others )
310
- self . _list . clear ()
311
- self ._list .extend (sorted (self ._set ))
308
+ # Elements were only added.
309
+ self ._list .extend (element for element in sorted (self ._set - set ( self . _list ) ))
312
310
313
311
314
312
# Type it as `set[str]` to express our intent for it to be used as such.
0 commit comments