python - 以正确的顺序根据另一个列表从列表中删除元素
问题描述
我想在 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 的序列。
解决方案
这个问题是一个子字符串搜索问题,因此可以在这里应用 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]
推荐阅读
- javascript - 为什么 Javascript 函数不能按编码顺序工作?
- spring-boot - ManyToOne FetchType.LAZY 不起作用。获取列表时总是返回 null
- pandas - pandas - 具有端点条件的切片数据帧
- spring - 我有一个公开 POST API 的 Spring Boot 应用程序,我需要处理请求正文并将数据插入配置单元
- javascript - 无法对 Unicode Emojis discord.js 做出反应
- reactjs - 如何在函数中使用反应组件?
- swift - 如何在 SwiftUI 的类中运行来自 View in a Timer 的操作?
- node.js - 在 express.js 中关闭浏览器后会话即将过期
- flutter - 如果我们在 GetX 上使用 bottomNavigationBar,如何使用内部导航
- c# - 编组包含 ByValTStr 字符串的结构时是否需要调用 Marshal.DestroyStructure