python遍历集合元素的同时删除元素
时间: 2023-05-26 13:03:21 浏览: 188
在 Python 中,如果遍历集合元素的同时删除元素,会导致遍历过程中集合的大小改变,从而引发异常。因此,应该先将需要删除的元素保存到一个新的集合中,遍历完成后再从原始集合中删除这些元素。
例如:
```python
my_set = {1, 2, 3, 4, 5}
to_remove = set()
for item in my_set:
if item % 2 == 0:
to_remove.add(item)
for item in to_remove:
my_set.remove(item)
print(my_set) # 输出 {1, 3, 5}
```
在上面的示例中,我们先遍历 `my_set`,将需要删除的元素保存到 `to_remove` 集合中,然后再遍历 `to_remove`,从 `my_set` 中删除这些元素。最后,输出修改后的 `my_set`。
相关问题
python遍历时删除元素
在Python中,遍历时删除元素需要特别小心,因为删除元素会改变列表、字典或集合的大小,可能会导致索引越界或漏删等问题。以下是三种常见数据类型在遍历时删除元素的方法:
1. 列表(list):建立一个空的列表,将需要删除的元素下标暂存于该列表中,最后再根据这个下标列表逆序删除元素[^1]。
```python
nums = [1, 3, 2, 4, 2, 5]
delete_indexes = []
for i, num in enumerate(nums):
if num == 2:
delete_indexes.append(i)
for j in reversed(delete_indexes):
nums.pop(j)
print(nums) # 输出:[1, 3, 4, 5]
```
2. 字典(dict):也可以采用暂存下标的方法,但是需要注意遍历字典时使用字典视图(dict.view()),因为字典的键可能会因删除而改变,导致出现KeyError的错误。
```python
scores = {'Alice': 80, 'Bob': 90, 'Charlie': 70, 'David': 60}
delete_keys = []
for name, score in scores.items():
if score < 75:
delete_keys.append(name)
for key in delete_keys:
del scores[key]
print(scores) # 输出:{'Alice': 80, 'Bob': 90}
```
3. 集合(set):由于集合没有重复元素,因此可以直接在遍历时删除元素,不会出现漏删的情况。
```python
words = {'apple', 'banana', 'cherry', 'date', 'elderberry'}
for word in words.copy():
if len(word) > 6:
words.remove(word)
print(words) # 输出:{'apple', 'banana', 'date'}
```
(1)定义Set集合,存入多个字符串 (2)删除集合中不满足身份证号码的数据 身份证要求: - 长度必须18位 - 数字0不能开头 - 除了最后一位,中间不允许有数字 - 最后一位可以是数字或者Xx (3)然后利用迭代器遍历集合元素并输出
(1)定义Set集合,存入多个字符串:
```python
string_set = {"Hello", "World", "123", "身份证号码", "430524199901010011", "43052419990101001X", "012345678901234567"}
```
(2)删除集合中不满足身份证号码的数据:
```python
for s in string_set.copy():
if len(s) != 18 or s[0] == '0' or not s[0:17].isdigit() or (s[17] not in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'x', 'X']):
string_set.remove(s)
```
(3)然后利用迭代器遍历集合元素并输出:
```python
for s in string_set:
print(s)
```
完整代码如下:
```python
string_set = {"Hello", "World", "123", "身份证号码", "430524199901010011", "43052419990101001X", "012345678901234567"}
for s in string_set.copy():
if len(s) != 18 or s[0] == '0' or not s[0:17].isdigit() or (s[17] not in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'x', 'X']):
string_set.remove(s)
for s in string_set:
print(s)
```
阅读全文