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

时间:2019-01-18 22:07:13

标签: python python-3.x

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

我正尝试从del1中删除l中的项目。因此,理想的结果是一个名为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)

对此有何想法?

4 个答案:

答案 0 :(得分:4)

您需要循环浏览一次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]

答案 1 :(得分:2)

您的逻辑很混乱,为什么要在删除列表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)

a设为[1, 5, 10]


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

import collections
l = [1,5,10,5,10]
del1 = [5,10]
a = []
dels_to_go = collections.Counter(del1)
for element in l:
    if dels_to_go[element]:
        dels_to_go[element] -= 1
    else:
        a.append(element)

其输出与以前相同。


请注意,您可能会想使用set(),但是在del1包含重复值的情况下,此方法不起作用。

答案 2 :(得分:0)

如果del1不包含重复的项目,则可以将del1设置为一组,以提高查询效率,如果项目位于以下位置,则避免将l中的项目附加到a集合,并在遇到集合后将其从集合中删除:

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

a变为:

[1, 5, 10]

答案 3 :(得分:-1)

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

let handler = function (e) {
  // do stuff
};

if (isTouchDevice()) {
  key.addEventListener('touchstart', handler);
} else {
  key.addEventListener('mousedown', handler);
}

function isTouchDevice() {
  var prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');
  var mq = function (query) {
    return window.matchMedia(query).matches;
  };
  if (('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {
    return true;
  }

  // include the 'heartz' as a way to have a non matching MQ to help terminate the join
  // https://git.io/vznFH
  var query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');
  return mq(query);
}

但是,如果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

但是它变得荒谬。

我想我会留下答案,以作为证据证明一个衬套对这个问题是个坏主意。