2017-03-08 16 views
0
list1 = [48, 33, 46, 46, 87, 11, 50, 99, 65, 87] 
list2 = [48, 33, 46] 
duplicates = [list1.pop(list1.index(i)) for i in list1 if i in list2] 

だから、これは宿題である[48,46] 持つことになりますと質問が コードが行うと説明することが期待されたものですか予想される結果を得るためにコードを変更する必要があります。リストインデックスパイソンとリスト内包

+0

とStackOverflowがあなたの宿題をすると思いますか? – ValLeNain

+0

あなたの宿題は、例のコードとしてあなたにそのリストの理解を与えましたか?そのような方法でリスト理解を使用しないでください。リスト内包は、データを変換する*ためであり、副作用を引き起こす操作を使用しない*。 'list1.pop'のように、それはリスト内包するものではないからです。 –

+0

は、繰り返し実行している間にアイテムを削除しているように見えますが、それを行うべきではありません。 –

答えて

0

こと:それを反復しながら、それはlist1から項目が削除されるため

[list1.pop(list1.index(i)) for i in list1 if i in list2] 

が間違っています。だから、あなたはいくつかの要素をスキップします。入力リストのコピーを作成

は何とかそれを修正します。

list1 = [48, 33, 46, 46, 87, 11, 50, 99, 65, 87] 
list2 = [48, 33, 46] 
duplicates = [list1.pop(list1.index(i)) for i in list1[:] if i in list2] 

は、今私が手:[48, 33, 46, 46]。ちょうどあなたのlist1.pop(list1.index(i))が本当に次善ですが、インデックスは項目が削除されたときにシフトしているので、必要なlist

list(set([48, 33, 46, 46])) => [48, 33, 46] 

ノートに戻ってsetに変換し、その結果に重複を削除し、あなたはそうではないために、

duplicates = [i for i in list1 if i in list2] 

あなたが同じ結果を取得し、それがlist1を変更しません。ただやる重複を計算するにはlist1

を変更する気に。