迭代和从集合中删除是否可能?

2024-04-27 04:34:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我没有一段我想看的特定代码;但是,我确实有一个问题,我似乎无法得到一个直接、明确的答案。你知道吗

问题是:如果我有一个集合,我可以在for循环中迭代它。当我迭代它时,我可以使用.remove()删除特定的数字吗?或者我必须先将我的集合转换成一个列表吗?如果是这样的话,为什么我必须先转换它?你知道吗


Tags: 答案代码列表for数字remove
3条回答

我就是这样做的:

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已经很好地解释了为什么在迭代过程中删除不起作用,但是我想建议一个替代方法:不要在迭代的同时删除,而是作为第二阶段来执行。所以,你应该:

  1. 在集合上迭代以决定要删除的内容,并分别存储要删除的内容的集合。你知道吗
  2. 迭代要删除的集合并从原始集合中移除每个项。你知道吗

例如:

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,而且还有listdict

在这两种情况下,都应该避免迭代和从列表或集合中删除项。修改您正在迭代的内容不是一个好主意,因为您可能会得到意想不到的结果。例如,让我们从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]

我们希望列表是空的,但它给了我们这个结果。无论您是尝试遍历列表还是集合并删除项,这通常都不是一个好主意。你知道吗

相关问题 更多 >