从列表中删除子列表



我有一个列表,例如 l1 = [1,2,3,4]和另一个列表:l2 = [1,2,3,4,5,6,7,1,2,3,4] .我想检查l1是否是l2的子集,如果是,那么我想从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].

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

>>> 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]
>>>

我对此并不感到骄傲,它也不是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()中。同样,我并不为此感到自豪,但它至少适用于这个简单的案例。胡安帕的解决方案比这更可取。

相关内容

  • 没有找到相关文章

最新更新