2010-11-29 13 views
0
いくつかのresonのために上記のコードは、このエラー「とValueError:list.remove(X):リストにないX」与え
filtered_list = ['PerezHilton', 'tomCruise', 'q', 'p'] 
#BIO[user]['follows'] is just a list of strings say ['a', 'b', 'katieh'] 
#specs is also a string say eg. 'katieh' 
for user in filtered_list: 
    if specs not in BIO[user]['follows']: 
     filtered_list.remove(user) 

なぜそれがありませんが、はっきりと「P」はリストに含まれているが'p'を検出しましたが、 'q'が見つかりましたか?私は今*Pythonの文句を言わない削除項目

+0

私は従いません。 x変数はどこに正確に入りますか? – Evan

+0

'item'を反復する必要はありません。その物が「でない」ときにあなたはなぜ取り除かれていますか? – lijie

+0

それは私にエラー(2.6)を与えません。 – sje397

答えて

8

ポストの一番下にある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] 

これを実行することができます。ここにリストのコピーはありません。

1

なぜあなたは反復していますか?

>>> un = ['PerezHilton', 'tomCruise', 'q', 'p'] 
>>> un.remove('p') 
>>> un 
['PerezHilton', 'tomCruise', 'q'] 
+0

私はそれが機能しますが、ユーザーがBIOに存在しないかどうかを確認する、ユーザー] ['フォロー']し、そのユーザーを削除します。 katiehがリストにあるので、「ユーザー」は保管しておく必要があります。私はそれが 'q'を取り除くときに 'p'を取り除かない理由を理解していない。 – 1337holiday

関連する問題