python - 如何从列表中删除每次出现的子列表

标签 python list-manipulation

我有两个列表:

big_list = [2, 1, 2, 3, 1, 2, 4]
sub_list = [1, 2]

我想删除 big_list 中出现的所有 sub_list。

结果应该是 [2, 3, 4]

对于字符串,你可以使用这个:

'2123124'.replace('12', '')

但是 AFAIK 这不适用于列表。

这不是 Removing a sublist from a list 的副本因为我想从大列表中删除所有子列表。在另一个问题中,结果应该是 [5,6,7,1,2,3,4].

更新:为简单起见,我在此示例中采用了整数。但列表项可以是任意对象。

更新2:

如果 big_list = [1, 2, 1, 2, 1]sub_list = [1, 2, 1], 我希望结果是 [2, 1] (如 '12121'.replace('121', ''))

更新3:

我不喜欢将 StackOverflow 中的源代码复制并粘贴到我的代码中。这就是我在软件推荐中提出第二个问题的原因:https://softwarerecs.stackexchange.com/questions/51273/library-to-remove-every-occurrence-of-sub-list-from-list-python

Update4:如果你知道一个库来调用这个方法,请将其写为答案,因为这是我的首选解决方案。

测试应该通过这个测试:

def test_remove_sub_list(self):
    self.assertEqual([1, 2, 3], remove_sub_list([1, 2, 3], []))
    self.assertEqual([1, 2, 3], remove_sub_list([1, 2, 3], [4]))
    self.assertEqual([1, 3], remove_sub_list([1, 2, 3], [2]))
    self.assertEqual([1, 2], remove_sub_list([1, 1, 2, 2], [1, 2]))
    self.assertEquals([2, 1], remove_sub_list([1, 2, 1, 2, 1], [1, 2, 1]))
    self.assertEqual([], remove_sub_list([1, 2, 1, 2, 1, 2], [1, 2]))

最佳答案

您必须自己实现它。基本思路如下:

def remove_sublist(lst, sub):
    i = 0
    out = []
    while i < len(lst):
        if lst[i:i+len(sub)] == sub:
            i += len(sub)
        else:
            out.append(lst[i])
            i += 1
    return out

这会遍历原始列表的每个元素,如果它不是子集的成员,则将其添加到输出列表中。此版本效率不高,但它的工作方式与您提供的字符串示例类似,因为它创建了一个不包含您的子集的新列表。只要它们支持 ==,它也适用于任意元素类型。从 [1,1,1,1] 中删除 [1,1,1] 将正确地产生 [1],对于字符串。

这里是 IDEOne link炫耀结果

>>> remove_sublist([1, 'a', int, 3, float, 'a', int, 5], ['a', int])
[1, 3, <class 'float'>, 5]

关于python - 如何从列表中删除每次出现的子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51518601/

相关文章:

python - 从列表中删除数字而不更改总和

python-3.x - 有没有办法解压缩嵌套冗余列表的列表?

functional-programming - OCaml中的懒惰 "n choose k"

C# 列表操作

python - Keras GRUCell 缺少 1 个必需的位置参数 : 'states'

python - Doctests 在 C 扩展和 Python3 上因 UnicodeDecodeError 而失败

python - 如何在 selenium chromedriver 中使用经过身份验证的代理?

python - 如何向量化这个累积运算?

python - 在列表之间插入的最有效方法?

delphi - 如何在 for 循环期间交换 TList 项