2017-02-23 70 views
-3

如何从另一个列表中删除一个删除该元素的列表一次。像下面的例子:如何从另一个列表中删除一个删除该元素的列表

list1= [1, 2, 3, 4, 5, 6, 7, 3, 4, 4, 5] 
list2= [1, 2, 3, 4, 5] 
Output=[6, 7, 3, 4, 4, 5] 

我常用的一套,但它移除所有在一个列表中的元素形成另一个列表

set(list1)-set(list2) 
output= {6, 7} 
+1

你试过了什么?你有什么问题?我们帮助解决不做你的工作 –

+0

所以,你想要为'list2'中的每个项目移除第一个找到的'list1'项目? –

+0

是的,可能是第一次发现项目是一个正确的字 – Dani

回答

0

你可以通过第二个列表进行迭代,并从删除元素如果找到了第一个列表。这里是一个示例代码:

for element in l2: 
if element in l1: 
    index = l1.index(element) 
    del l1[index] 

编辑:请参阅命令行的输入/输出。

输入:

>>> l1 = [1, 2, 3, 4] 
>>> l2 = [2, 3, 5, 6] 
>>> for element in l2: 
... if element in l1: 
... index = l1.index(element) 
... del l1[index] 
... 

输出:

>>> l1 
[1, 4] 
+0

看来这个代码不起作用。 – Dani

+0

你有什么错误?我用命令行的输入/输出编辑了我的答案,它向你展示了它给你两个列表之间的区别。根据你的代码,你需要用list1和list2替换我的代码中的列表名称。 – RobinW2

0

要比较两个列表,你需要看看这个问题,参照列表2。既然你想删除每个副本,你可以遍历list2并删除list1中的每个重复条目,因为它们是在引用list2时发现的。

list1= [1, 2, 3, 4, 5, 6, 7, 3, 4, 4, 5] 
list2= [1, 2, 3, 4, 5] 
Output=[6, 7, 3, 4, 4, 5] 

for i in list2: 
    try: del list1[list1.index(i)] 
    except ValueError: pass 

这样,如果一个项目在列表2它是从列表1很多次,因为它在列表2时删除,如果在第二个列表比第一类是一个项目的多次出现,错误被捕获。

1

您首先需要一个唯一元素(集合)的集合来选择要在列表中删除的元素。然后,逐个遍历一个唯一元素集合,并从列表中删除该元素的一个实例,直到集合中没有更多独特元素。

li = [1, 2, 3, 4, 5, 6, 7, 3, 4, 4, 5] 
se = {1, 2, 3, 4, 5, 9} # 9 is intentionally added to show error handling 

for element in se: 
    try: 
     li.remove(element) 
    except ValueError: 
     print("Element '%s' doesn't exist in the list." % element) 

print(li) # prints: [6, 7, 3, 4, 4, 5] 

需要注意的是list.remove()提出了一个ValueError应该试图删除一个不存在的项目发生是非常重要的。一种方法(pythonic方法越多)就是让try-except块捕获错误。您可以选择您希望如何处理错误;我只是选择打印出错误信息。另一种方法是进行防守测试。下面是如果其他的防御性编码:

li = [1, 2, 3, 4, 5, 6, 7, 3, 4, 4, 5] 
se = {1, 2, 3, 4, 5} 

for element in se: 
    if element in li: 
     li.remove(element) 

print(li) # prints: [6, 7, 3, 4, 4, 5] 
1

一个衬垫利用副作用
列表解析输出是不是你想要的清单 - 但它正在修改list1,因为它的工作原理

list1= [1, 2, 3, 4, 5, 6, 7, 3, 4, 4, 5] 
list2= [1, 2, 3, 4, 5] 


[list1.pop(list1.index(e)) for e in list2 if e in list1] 
Out[65]: [1, 2, 3, 4, 5] 

list1 
Out[66]: [6, 7, 3, 4, 4, 5] 

它看起来会更好,如果你还需要列表理解输出删除的项目,否则有人可能会认为你滥用了列表理解,当你应该刚刚写了一个for循环

相关问题