我知道已经问过这个问题的变体了,但是我找不到能解决我的特定目的的
我试图在Python中获取两个带有字符串元素的列表,并删除两者的重叠部分。例如:
list1 = ["25","+","7","*","6","/","7"]
list2 = ["7","*","6"]
应该去
["25","+","/","7"]
我考虑了
的列表理解[i for i in list1 if not in list2]
但这会产生
["25","+","/"]
因为两个“ 7”的实例都会被删除。
我如何才能在这里实现自己的目标?谢谢。
编辑-这被标记为可能重复。在我的列表理解示例中,我已经解释了与链接的列表有何不同的问题。
答案 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']