Python 嵌套循环以删除列表中的项目
我有两个列表,都有n个项目。例如,我有list l=[1,5,10,5,10]和list del1=[5,10] 我试图从l中删除del1中的项目一次。因此,期望的结果是一个名为a=[1,5,10]的新列表 我尝试执行嵌套循环,但我就是想不出来,请参见下面的代码: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:
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)]