2012-02-06 6 views
3

リストを中断している間に、現在のアイテムのIDを取得してメソッドをリストする方法はありますか?簡単な例でリストを中断しながらインデックスを取得する

xl = [1,2,3] # initial list 
yl = [3,2] # list used to remove items from initial list 

for x in xl[:]: 
    for y in yl: 
     if x == y: 
      xl.pop(x) # problem 
      break 
     print x, y 
print xl 

、私は2つのリストをループにしたい、と私は似たアイテムを見つけたときに、リストから1

を、それを削除し、私はラインでXの代わりに何を使うべきコメント"#problem"で?

PS:iterating from iteratingです。

答えて

8

これを行う一般的な方法は、enumerateです。

for idx, item in enumerate(iterable): 
    pass 

しかし、あなたのユースケースでは、これはあなたが試していると思われることを非常に非凡な方法ではありません。リストを反復して同時に変更することは避けてください。リスト内包表記を使用してください:

xl = [item for item in xl if item not in yl] 
+1

+1を列挙しますが、明確にするために、リストのサイズを変更するという点ではなくインデックスの値を変更するという観点からループを変更してください。コピーを使ってそれをやっても、効率的ではないかもしれませんが、安全です。 – jdi

2

代わりにあなたが好きではない要素を除去する、あなたは、単にfilterを使用する必要があります。

また
x1 = filter(x1, lambda x: x not in y1) 

list comprehensionも同様に動作します

x1 = [x for x in x1 if x not in y1] 

Y1が非常に大きい場合は、あなたがすべき次のようにセットで検索します。

y1set = set(y1) 
x1 = filter(x1, lambda x: x not in y1set) 

参考のため、popはインデックスを取得し、インデックスを取得する一般的な方法はenumerateです。しかし、ほとんどの場合、インデックスを使用するよりも、コードを書くのがより短く、よりクリーンな方法です。これはlist comprehensionとして知られているどの程度xl = [x for x in xl if x not in y]

+0

これは実際にはデータベースへのマッピングです。この場合、私はインデックスを保持したいです。私のビジネスロジックでは、私はDBから削除すると、私はメモリリストから削除されます。 – gcb

+0

@gcbインデックスを保持したい場合は、 'pop'を使うべきではありませんが、' x1'リストのエントリをいくつかのマーカー値に設定するべきです「なし」とする。 – phihag

+0

私もインデックスを削除したいです。 – gcb

4

+0

それは '単純な例'でした。 2つの番号を照合するだけでなく、HTTP要求とチェックを行わないことが必要になります。 – gcb

+2

@gcbそれは問題ではありません。 'checkHttpRequestsAndWhatNot(x) ''ならばxl = [xのxはx]、それよりも短い 'x1 = filter(x1、checkHttpRequestsAndWhatNot)'で、あなたが望むだけチェックできます。 – phihag

+0

それは良い点です...私は今使っている構造を見直すと思います。 – gcb

関連する問題