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