给出list1
= [1,2,2,3]
,list2
= [1,2]
,最简单的方法是从list1中减去list2的所有元素以获得列表list3
= { {1}}
对于两个列表来说,总和似乎效果很好,但减法却不然。
要澄清:顺序无关紧要。 L2是L1的子集。重复项需要保留。因此不能使用[2,3]
。
set
答案 0 :(得分:2)
您可以尝试使用remove
:
list1 = [1,2,2,2,3]
list2 = [1,2,2]
[list1.remove(i) for i in list2]
list1
输出:
[2, 3]
for i in list2:
list1.remove(i)
list1
输出:
[2, 3]
答案 1 :(得分:1)
您可以使用collections.Counter和list comprehension:
from collections import Counter
list1 = [1, 2, 2, 2, 3]
list2 = [1, 2, 2]
counts = Counter(list2)
result = [l for l in list1 if counts.get(l, 0) == 0 or counts.subtract((l,))]
print(result)
输出
[2, 3]
列表理解与等效为:
result = []
for l in list1:
if counts.get(l, 0) == 0 or counts.subtract((l,)):
result.append(l)
这里最棘手的部分是语句counts.get(l, 0) == 0 or counts.subtract((l,))
。 counts.subtract((l,))
的意思是从l
的计数中减去1,表达式的返回值为None
,None
是一个类似布尔值的事实(等于False
)允许使用单个or
表达式。因此,上面的或仅在True
时为counts.get(l, 0) == 0
。
答案 2 :(得分:1)
这就是我要做的:
def remove_elems(l1, l2):
removals = set(l2)
result = []
for elem in l1:
if elem in removals:
removals.remove(elem)
else:
result.append(elem)
return result
l1 = [1,2,2,3]
l2 = [1,2]
print(remove_elems(l1, l2)) # -> [2, 3]