Python消除列表重叠

Python消除列表重叠,python,list,Python,List,我知道已经有人问过关于这个问题的各种各样的问题,但我所能找到的问题中没有一个能解决我的具体目标 我试图在Python中获取两个包含字符串元素的列表,并删除这两个列表的重叠部分。例如: list1 = ["25","+","7","*","6","/","7"] list2 = ["7","*","6"] >>> list1 = ["25","+","7","*","6","/","7"] >>> list2 = ["7","*","6"] >>&

我知道已经有人问过关于这个问题的各种各样的问题,但我所能找到的问题中没有一个能解决我的具体目标

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

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

["25","+","/","7"]
我考虑了一份清单,内容大致如下:

[i for i in list1 if not in list2]
但这将是一种让步

["25","+","/"]
因为“7”的两个实例都将被删除

我怎样才能实现我在这里的目标?谢谢


编辑-已将其标记为可能的副本。在我的列表理解示例中,我已经解释了这是一个与链接问题不同的问题。

基本上,您需要对多个集合(即行李)执行差异操作:

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

例如:

list1 = ["25","+","7","*","6","/","7"]
list2 = ["7","*","6"]
>>> list1 = ["25","+","7","*","6","/","7"]
>>> list2 = ["7","*","6"]
>>> list((Counter(list1) - Counter(list2)).elements())
['25', '+', '7', '/']
在Python3.6+中,这将是有序的(尽管目前还不能保证这一点,可能应该将其视为一个实现细节)。如果订单很重要,并且您没有使用此版本,则可能必须实现一个订单计数器

的确如此:


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

列表。删除(x)


你可以尝试使用计数器。顺序重要吗?可能重复@blhsing It not-你链接的问题涉及每一个事件,而我用列表理解的示例说明这不是我想要的。这类似于在较大的字符串中查找子字符串。我建议您阅读KMP(Knuth Morris-Pratt)算法,它可以直接应用到您的场景中。我相信这会很好,尽管根据列表,它可能会表现得相当糟糕。@juanpa.arrivillaga同意。添加了一条评论。我认为,如果配对较小(比我打赌的dict方法更好),这种方法表现良好。如果您使用的是两个大列表,那么最坏情况下的二次时间将影响您。@juanpa.arrivillaga感谢您让我们知道您的实验结果。此解决方案实际上无法维持秩序。请尝试
list1=[“6”、“6”、“7”、“6”、“7”、“6”]
list2=[“7”、“6”、“7”]
。输出为
['/'、'6'、'6']
,而输出应为
['6'、'/'、'6']
。此解决方案实际上不维护订单(即使使用
OrderedCounter
)。请尝试
list1=[“6”、“6”、“7”、“6”、“7”、“6”]
list2=[“7”、“6”、“7”]
。输出是
['6','6','/']
,当它应该是
['6','/','6']
@blhsing I get
['/','6','6']
,即维护
列表1的顺序时,但是,您是对的,这里的“维护顺序”是不明确的。不确定OP到底想要什么,他们也没有就此发表评论,但我知道“重叠”意味着什么。我的理解是OP想要用列表模拟字符串替换,所以它就像
'6/7676'。替换('767','')
,可以说结果是
'6/6'
,这就是为什么我说在这种情况下预期的输出应该是
['6','/','6']
@blhsing是的,我理解你的意思,但我认为这在这方面是不明确的。在任何情况下,如果元素总是字符串,那么您可能很难击败
list(“”.join(list1).replace(“”.join(list2),“”))
是的,它有点模糊。但是在这种情况下,简单的字符串替换是不行的,因为在OP的示例中,列表中有一个字符串的长度超过一个字符。
for i in list2:
    list1.remove(i)

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