我有两个列表,每个都有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)
对此有何想法?
答案 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
但是它变得荒谬。
我想我会留下答案,以作为证据证明一个衬套对这个问题是个坏主意。