Python删除列表重叠

时间:2018-08-07 02:30:09

标签: python list

我知道已经问过这个问题的变体了,但是我找不到能解决我的特定目的的

我试图在Python中获取两个带有字符串元素的列表,并删除两者的重叠部分。例如:

list1 = ["25","+","7","*","6","/","7"]
list2 = ["7","*","6"]

应该去

["25","+","/","7"]

我考虑了

的列表理解
[i for i in list1 if not in list2]

但这会产生

["25","+","/"]

因为两个“ 7”的实例都会被删除。

我如何才能在这里实现自己的目标?谢谢。

编辑-这被标记为可能重复。在我的列表理解示例中,我已经解释了与链接的列表有何不同的问题。

2 个答案:

答案 0 :(得分:4)

本质上,您希望对多件套(例如包)进行差异操作。 Python implements this for the collections.Counter object

  

提供了几种数学运算来组合Counter   对象以产生多重集(计数大于   零)。加减法将计数器相加或相加   减去相应元素的数量。交叉口和   union返回相应计数的最小值和最大值。每   操作可以接受带符号计数的输入,但是输出将   排除计数为零或更少的结果。

例如,

>>> list1 = ["25","+","7","*","6","/","7"]
>>> list2 = ["7","*","6"]
>>> list((Counter(list1) - Counter(list2)).elements())
['25', '+', '7', '/']

在Python 3.6及更高版本中,这将是有序的(尽管目前尚不能保证,并且可能应将其视为实现细节)。如果订单很重要,并且您没有使用此版本,则可能必须实现有序计数器。

确实the docs themselves provide just such a recipe

>>> from collections import Counter, OrderedDict
>>> class OrderedCounter(Counter, OrderedDict):
...     'Counter that remembers the order elements are first encountered'
...     def __repr__(self):
...         return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))
...     def __reduce__(self):
...         return self.__class__, (OrderedDict(self),)
...
>>> list((OrderedCounter(list1) - OrderedCounter(list2)).elements())
['25', '+', '/', '7']

答案 1 :(得分:3)

使用remove方法。可能慢。 O(n ^ 2)在更坏的情况下。

  

list.remove(x)

Remove the first item from the list whose value is x. 
It is an error if there is no such item.
for i in list2:
    list1.remove(i)

# list1 becomes
['25', '+', '/', '7']