从一个列表中减去一个列表中所有元素的最简单方法是什么?

时间:2018-12-26 15:09:20

标签: python

给出list1 = [1,2,2,3]list2 = [1,2],最简单的方法是从list1中减去list2的所有元素以获得列表list3 = { {1}}

对于两个列表来说,总和似乎效果很好,但减法却不然。

要澄清:顺序无关紧要。 L2是L1的子集。重复项需要保留。因此不能使用[2,3]

set

3 个答案:

答案 0 :(得分:2)

您可以尝试使用remove

list1 = [1,2,2,2,3]
list2 = [1,2,2]

[list1.remove(i) for i in list2] 
list1

输出:

[2, 3]

使用标准的for循环更新而无需列表理解。

for i in list2:
    list1.remove(i)
list1

输出:

[2, 3]

答案 1 :(得分:1)

您可以使用collections.Counterlist 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,表达式的返回值为NoneNone是一个类似布尔值的事实(等于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]