2017-03-08 102 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] 這是一個家庭作業和問題是什麼 代碼預期做和解釋如何代碼需要改變以獲得預期的結果。列表索引Python和列表理解

+0

所以你認爲StackOverflow會做你的功課? – ValLeNain

+0

你的作業給你的列表理解作爲示例代碼?不要*以這種方式使用列表理解。列表推導是用於*變換數據*,做*不*使用引起副作用的操作,例如,像'list1.pop',因爲這不是列表理解的目的。 –

+0

看起來像你在迭代時刪除項目,你不應該那樣做。 –

回答

0

說:

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

是錯誤的,因爲它從list1刪除的項目,而在它迭代。所以你跳過一些元素。

進行輸入列表的副本修復它在某種程度上:

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]。要在結果中刪除重複,只是轉換爲set和回list

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

請注意,您list1.pop(list1.index(i))真的是次優的,而是因爲當一個項目被刪除索引轉移必需的,你不關心改變list1

要計算重複只是做:

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

你得到相同的結果,並不會改變list1