2

我有一个需要迭代的 python 集,对于每个元素,检查它是否满足约束,如果满足,请将其删除并将其添加到另一个可能已经非空的集合中。我可以将它添加到缓冲区,然后在循环完成后,遍历缓冲区并从集合中删除其内容,但必须有更好的方法来做到这一点。

这是我正在尝试做的事情:

for elem in S:
  if (P(elem)):
    S.remove(elem)
    T.add(elem)

这行不通。

这是可行但不干净的修复程序:

B = set()
for elem in S:
  if (P(elem)):
    B.add(elem)
    T.add(elem)
for elem in B:
  S.remove(elem)

编辑:最好的解决方案似乎是:

for elem in S.copy():
  if (P(elem)):
    S.remove(elem)
    T.add(elem)
4

3 回答 3

2

对于列表,在迭代之前创建一个副本:

for elem in S[:]:

其中[:]切片符号创建完整列表的副本。在迭代列表时,您不能以其他方式从列表中删除元素。

于 2013-01-13T22:54:47.913 回答
1

一种选择是使用列表推导来创建T然后删除Tfrom中的所有元素S

T = set([elem for elem in S if P(elem)])
S = S - T
于 2013-01-13T22:56:29.880 回答
0

如果迭代列表两次并P()为每个项目调用两次不是问题,这将是最易读的解决方案::

T = [x for x in S if P(elem)]
S = [x for x in S if not P(elem)]
于 2013-01-13T22:57:25.897 回答