2017-03-08 104 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