从列表中删除子列表

时间:2017-03-19 00:51:21

标签: python list sublist remove-if

我有一个列表,例如l1 = [1,2,3,4]和另一个列表:l2 = [1,2,3,4,5,6,7,1,2,3,4]。 我想检查l1l2中的子集,如果是{I},那么我想从l2中删除这些元素,以便l2成为[5,6,7,1,2,3,4]其中索引0-3已被删除。

有没有这样做的pythonic方式?

我试过了:

l1 = [1,2,3,4]
l2 = [1,2,3,4,5,6,7,1,2,3,4]
l3 = []
for i in l2:
    if i in l1:
        l3.append(i)
-> prints [5,6,7]

但我希望输出为[5,6,7,1,2,3,4]

2 个答案:

答案 0 :(得分:3)

嗯,这是一种蛮力的方式。可能有更有效的方法。如果您希望尽早遇到匹配的子列表,那么性能应该不会很糟糕。

>>> l1 = [1,2,3,4]
>>> l2 = [1,2,3,4,5,6,7,1,2,3,4]
>>> for i in range(0, len(l2), len(l1)):
...     if l2[i:len(l1)] == l1:
...         del l2[i:len(l1)]
...         break
...
>>> l1
[1, 2, 3, 4]
>>> l2
[5, 6, 7, 1, 2, 3, 4]
>>>

或者,如果您不想修改l2,则可以执行以下操作:

>>> l1 = [1,2,3,4]
>>> l2 = [1,2,3,4,5,6,7,1,2,3,4]
>>> for i in range(0, len(l2), len(l1)):
...     if l2[i:len(l1)] == l1:
...         break
...
>>> l2[:i] + l2[i+len(l1):]
[5, 6, 7, 1, 2, 3, 4]
>>>

答案 1 :(得分:0)

我并不以此为荣,而且它不是pythonic,但我认为写作可能会有点乐趣。我已经对代码进行了注释,以使其更加明显。

>>> import re
>>> from ast import literal_eval

>>> l1 = [1,2,3,4]
>>> l2 = [1,2,3,4,5,6,7,1,2,3,4]
>>> literal_eval(         # convert the string into a python collection
...    re.sub(            # use a regex as a replacement
...       str(l1)[1:-1],  # string of the list, without surrounding brackets
...       '',             # replace with empty
...       str(l2)[1:-1],  # string for replacement, again without brackets
...       count=1         # only replace the first match
...    ).strip(',')       # replace any preceeding or trailing commas
...     .strip()          # replace any preceeding or trailing whitespace
... )
(5, 6, 7, 1, 2, 3, 4)

这里的输出是一个元组,但是你可以把它包装在list()中,如果那是你真正想要的。同样,我并不为此感到骄傲,但它至少对这个简单的案例起作用。 Juanpa的解决方案比这更好。