Python 嵌套循环以删除列表中的项目

Python 嵌套循环以删除列表中的项目,python,python-3.x,Python,Python 3.x,我有两个列表,都有n个项目。例如,我有list l=[1,5,10,5,10]和list del1=[5,10] 我试图从l中删除del1中的项目一次。因此,期望的结果是一个名为a=[1,5,10]的新列表 我尝试执行嵌套循环,但我就是想不出来,请参见下面的代码: l= [1,5,10,5,10] s=l a=[] count=0 del1=[5,10] for i in del1: for x in s: a.append(x) if a ==i:

我有两个列表,都有n个项目。例如,我有list l=[1,5,10,5,10]和list del1=[5,10]

我试图从l中删除del1中的项目一次。因此,期望的结果是一个名为a=[1,5,10]的新列表

我尝试执行嵌套循环,但我就是想不出来,请参见下面的代码:

l= [1,5,10,5,10]

s=l

a=[]

count=0
del1=[5,10]
for i in del1:
    for x in s:
        a.append(x)
        if a ==i:
            a.remove(i)
        else:
            pass


print (a)

对此有什么想法吗?

您需要在del列表中循环一次:

lst= [1,5,10,5,10]
del1=[5,10]
res = lst[:]

for elem in del1:
    try:
        res.remove(elem)
    except ValueError:
        pass
res

输出:[1,5,10]

您的逻辑很混乱,为什么要迭代删除列表del1,然后在该列表中迭代s或l

这毫无意义

相反,只需从del1中删除元素即可

l = [1,5,10,5,10]
del1 = [5,10]
a = []
for element in l:
   if element in del1:
       del1.remove(element)
   else:
       a.append(element)
给出一个as[1,5,10]

更有效的方法是使用collections.Counter对象

这将提供与以前相同的输出

注意,您可能会尝试使用集合,但这在del1包含重复值的情况下不起作用。

如果del1不包含重复项,您可以将del1设置为集合,以便更有效地查找,如果项在集合中,则避免将l中的项附加到a中,并在遇到该项时将其从集合中删除:

del1 = set(del1)
a = []
for i in l:
    if i in del1:
        del1.remove(i)
        continue
    a.append(i)
a变成:


如果有一种方法返回一个列表,而不是给定元素的第一次出现,那么这个解决方案会更好

def remove1(lst, elem):
  lst.remove(elem)
  return lst

cpy = lst[:]
res = [x for x in lst if x not in del1 or x in remove1(cpy, x)]
但是,如果del1中存在重复条目,这将不起作用。这会管用的

res = [x for x in lst if x not in dlt or x in remove1(cpy, x) and x not in remove1(dlt, x)]
但这越来越荒谬了


我想我会留下我的答案作为证据,证明一行是解决这个问题的坏主意。

s=l是无用的-s和l都指向相同的数据。。。请参见嵌套循环没有任何用处-只需在土地上循环-仅向不在del1中的项目添加内容-删除未从del1复制的每个项目他只想删除在del1中找到的内容的单个实例。不是每一个例子。否则:通过没有任何意义。你应该删除它。@PatrickArtner我的想法完全正确。为了提高效率,我在del1中使用了一个collections.Counter实例进行O1查找。我一开始考虑过这一点,但如果del1包含重复项会怎么样/当时就注意到了。谢谢。什么,在我提交答案的那一刻,我是如何立即获得两张反对票的?这并没有产生预期的结果。这将只返回[1]。您需要考虑重复的值。我明白了。我要试着为它画一条线。@PMende你现在能再看一眼吗?我喜欢你画得很深的方式copy@prashantrana这不是一个深度拷贝,但它是一个拷贝。如果列表中有对象,我想它应该是引用副本。
def remove1(lst, elem):
  lst.remove(elem)
  return lst

cpy = lst[:]
res = [x for x in lst if x not in del1 or x in remove1(cpy, x)]
res = [x for x in lst if x not in dlt or x in remove1(cpy, x) and x not in remove1(dlt, x)]