45

私は set を持っていmysetて、それを繰り返し処理してアイテムに対して何らかの操作を実行する関数を持っています。この操作は最終的にセットからアイテムを削除します。

明らかに、元のセットを反復しながらそれを行うことはできません。ただし、これを行うことができます:

mylist = list(myset)
for item in mylist:
    # do sth

もっと良い方法はありますか?

4

5 に答える 5

28

まず、セットを使用すると、Zero Piraeus が私たちに言ったように、次のことができます。

myset = set([3,4,5,6,2])
while myset:
    myset.pop()
    print(myset)

printこれらの出力を提供するメソッドを追加しました

>>> 
set([3, 4, 5, 6])
set([4, 5, 6])
set([5, 6])
set([6])
set([])

リストの選択に固執したい場合は、リスト内包表記を使用してリストをディープコピーし、元のリストから項目を削除しながらコピーをループすることをお勧めします。私の例では、元のリストの長さをループごとに減らします。

l = list(myset)
l_copy = [x for x in l]
for k in l_copy:
    l = l[1:]
    print(l)

与える

>>> 
[3, 4, 5, 6]
[4, 5, 6]
[5, 6]
[6]
[]
于 2013-05-14T19:42:57.680 に答える
13

これはうまくいくはずです:

while myset:
    item = myset.pop()
    # do something

または、条件付きで項目を削除する必要がある場合:

def test(item):
    return item != "foo"  # or whatever

myset = set(filter(test, myset))
于 2013-05-14T19:33:54.343 に答える
5

別の方法は次のとおりです。

s=set()
s.add(1)
s.add(2)
s.add(3)
s.add(4)
while len(s)>0:
    v=next(iter(s))
    s.remove(v)
于 2016-08-09T18:19:06.770 に答える
1

ライブラリを使用しcopyてセットのコピーを作成し、コピーを反復して元のセットから削除します。ループに固執し、for1 つの要素を 1 回だけ反復したい場合 - 必ずしもすべての要素を削除したくない場合に便利です。

import copy
for item in copy.copy(myset):
    myset.remove(item)
于 2020-01-24T07:55:03.773 に答える