首页 > 解决方案 > 以正确的顺序根据另一个列表从列表中删除元素

问题描述

我想在 Python 中执行以下操作:

假设我们有两个列表:

A = [3, 10, 100, 3, 100, 10, 5]
B = [3, 100, 10]

我只想从 A 中删除 B,前提是它的顺序正确。

所以这个例子的输出是:

A = [3, 10, 100, 5]

请注意,3、10、100 没有从 A 中删除,因为它们与 B 的顺序不同。我正在处理的列表永远不会有两个相同的数字相邻。重要的是数字在列表中的位置。更多示例,希望能更清楚地说明:

A = [1, 2, 3, 4, 3, 2, 1]
B = [3, 2, 1]

预期的输出将是:

A = [1, 2, 3, 4]

这样就保留了 A 的序列。

标签: pythonlist

解决方案


这个问题是一个子字符串搜索问题,因此可以在这里应用 KMP、BM 等子字符串搜索算法。

是一个由 Python 实现的 KMP 算法,来自 GitHub Gist。

用它来计算匹配的位置,最后去掉匹配:

A = [3, 10, 100, 3, 100, 10, 5]
B = [3, 100, 10]
result = KMP().search(A, B)
print(result)
#assuming at least one match is found
print(A[:result[0]:] + A[result[0]+len(B):])

输出:

[3]
[3, 10, 10, 5]

推荐阅读