2024-04-27 04:34:37 发布
网友
我没有一段我想看的特定代码;但是,我确实有一个问题,我似乎无法得到一个直接、明确的答案。你知道吗
问题是:如果我有一个集合,我可以在for循环中迭代它。当我迭代它时,我可以使用.remove()删除特定的数字吗?或者我必须先将我的集合转换成一个列表吗?如果是这样的话,为什么我必须先转换它?你知道吗
我就是这样做的:
myset = ... newset = set() while myset: v = myset.pop() if not do_i_want_to_delete_this_value(v): newset.add(v) myset = newset
列表理解也会起作用:
myset = set([x for x in myset if not do_i_want_to_delete_this_value(x)])
但是如果你想在迭代过程中做其他的事情,并且不想把所有的逻辑都封装在一个函数调用中,这会变得很混乱。但这样做没什么错。你知道吗
myset = set([x for x in myset if process_element(x)])
process\u element()只需返回True/False,说明是否应从集合中删除元素。你知道吗
@nathancy已经很好地解释了为什么在迭代过程中删除不起作用,但是我想建议一个替代方法:不要在迭代的同时删除,而是作为第二阶段来执行。所以,你应该:
例如:
def should_be_deleted(num): return num % 2 == 0 my_set = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} to_delete = [] for value in my_set: if should_be_deleted(value): to_delete.append(value) for value in to_delete: my_set.remove(value) print(my_set)
印刷品:
set([1, 3, 5, 7, 9])
同样的模式可以应用于从任何集合中删除,不仅是set,而且还有list、dict等
set
list
dict
在这两种情况下,都应该避免迭代和从列表或集合中删除项。修改您正在迭代的内容不是一个好主意,因为您可能会得到意想不到的结果。例如,让我们从set开始
numbers_set = {1,2,3,4,5,6} for num in numbers_set: numbers_set.remove(num) print(numbers_set)
我们试图遍历并删除每个数字,但我们得到了这个错误。你知道吗
Traceback (most recent call last): File ".\test.py", line 2, in <module> for num in numbers_set: RuntimeError: Set changed size during iteration
现在你提到“我必须先把我的集合转换成一个列表吗?”。好吧,让我们来测试一下。你知道吗
numbers_list = [1,2,3,4,5,6] for num in numbers_list: print(num) numbers_list.remove(num) print(numbers_list)
结果如下:
[2, 4, 6]
我们希望列表是空的,但它给了我们这个结果。无论您是尝试遍历列表还是集合并删除项,这通常都不是一个好主意。你知道吗
我就是这样做的:
列表理解也会起作用:
但是如果你想在迭代过程中做其他的事情,并且不想把所有的逻辑都封装在一个函数调用中,这会变得很混乱。但这样做没什么错。你知道吗
process\u element()只需返回True/False,说明是否应从集合中删除元素。你知道吗
@nathancy已经很好地解释了为什么在迭代过程中删除不起作用,但是我想建议一个替代方法:不要在迭代的同时删除,而是作为第二阶段来执行。所以,你应该:
例如:
印刷品:
同样的模式可以应用于从任何集合中删除,不仅是
set
,而且还有list
、dict
等在这两种情况下,都应该避免迭代和从列表或集合中删除项。修改您正在迭代的内容不是一个好主意,因为您可能会得到意想不到的结果。例如,让我们从
set
开始我们试图遍历并删除每个数字,但我们得到了这个错误。你知道吗
现在你提到“我必须先把我的集合转换成一个列表吗?”。好吧,让我们来测试一下。你知道吗
结果如下:
我们希望列表是空的,但它给了我们这个结果。无论您是尝试遍历列表还是集合并删除项,这通常都不是一个好主意。你知道吗
相关问题 更多 >
编程相关推荐