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

1つのオプションは、リスト内包表記を使用して、内のすべての要素を作成してからT削除することです。TS

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

リストを2回繰り返しP()、各アイテムに対して2回呼び出すことが問題にならない場合、これが最も読みやすい解決策になります。

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 に答える