如何从列表列表中删除列表集

How to remove set of lists from a list of lists

提问人:Codingamethyst 提问时间:9/3/2022 最后编辑:Codingamethyst 更新时间:9/3/2022 访问量:75

问:

我有 2 个字符串列表

List1 = [["Hey there"], ["hi"], ["hello"]]
List2 = [["hi"], ["hello"]]

有没有一种 O(n) 方法可以删除 from 的元素?List2List1

期望输出 =[["Hey there"]]

Python 字符串列表 嵌套列表的 区别

评论

0赞 rv.kvetch 9/3/2022
List1 - 也许是 List2?
3赞 Kenny Ostrom 9/3/2022
我认为您必须使用基本的语言结构将它们转换为元组集才能获得 O(n)。
1赞 wjandrea 9/3/2022
FWIW,这是一个 O(n*m) 方法
1赞 Codingamethyst 9/3/2022
@wjandrea 不,列表实际上包含多个元素,而是长句。我使用 1 个元素列表作为示例。
1赞 wjandrea 9/3/2022
然后我认为不可能得到 O(n),因为数据本身是 n*k 大小,所以任何消耗所有数据的东西都必须是 O(n*k)。例如,偶数比较:是 O(n*k + m*j)。List1 == List2

答:

1赞 Pi Marillion 9/3/2022 #1

您可以通过两个 O(n) 步骤来执行此操作:

List2_set = set(map(tuple, List2))
List1_filtered = [row for row in List1 if tuple(row) not in List2_set]
  1. 将要排除的项目列表转换为settuples

    • 此转换为 O(n)
    • set是必需的,因为检查集合的隶属关系是 O(1) 而不是 O(n)
    • tuple是项所必需的,而不是 ,因为 是可散列的setlisttuple
  2. 检查每个元素的成员资格List1

    • 此检查也是 O(n)
    • 该集合使用哈希表来允许 O(1) 成员资格测试set

然后,总数为 O(n) + O(n) => O(n),也就是说,性能与 + 的总元素数呈线性关系。List1List2