我有两个列表:
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/