ポストの一番下にある1行に正しくこれを行い、リスト内包表記をそれを修正
**おかげSORRY、
はイム秀は困惑が、任意のヘルプは大歓迎です。最初に問題の洞察があります。悪いと紛らわしいことが起こるので
for item in list_:
list_.remove(item)
:
は次のようなものをしないでください。
>>> list_ = range(10)
>>> for item in list_:
... list_.remove(item)
...
>>> list_
[1, 3, 5, 7, 9]
アイテムを削除するたびに、ループを混乱させる残りのアイテムのインデックスを変更します。トラバース中にリストから項目を削除する良い方法の1つは、索引で実行し、は逆戻りの作業です。これにより、削除が残りの反復に影響しないようにすることができます。 9番目の要素を削除すると、8番目の要素はまだ8番目の要素ですが、10番目の要素は9番目の要素になるため、これは優れています。あなたがすでにその要素を扱っているなら、そのインデックスが何であるか気にしません。
>>> list_ = range(10)
>>> for i in xrange(len(list_) - 1, -1, -1):
... del list_[i]
...
>>> list_
[]
それともwhile
ループ付き:
i = len(list_)
while i:
i -= 1
del list_[i]
これがフィルタリングの仕事で、それらが最高で行われているのでだからあなたの場合には、コードが
users[:] = [user for user in users if specs in BIO[user]['follows']]
のようになります。リスト内包[:]
のポイントは、リストへの参照を壊すのではなく、リストのスライスに割り当てられることです。これは、リストへの他のすべての参照が更新されることを意味します。元のリストを上書きする前にコピーがであることを除いて、基本的にインプレースです。完全性のために、while
ループでそれを行う方法はここにあります。
i = len(users)
while i:
i -= 1
if specs not in BIO[users[i]]['follows']:
del users[i]
これを実行することができます。ここにリストのコピーはありません。
私は従いません。 x変数はどこに正確に入りますか? – Evan
'item'を反復する必要はありません。その物が「でない」ときにあなたはなぜ取り除かれていますか? – lijie
それは私にエラー(2.6)を与えません。 – sje397