我有一个列表,例如l1 = [1,2,3,4]
和另一个列表:l2 = [1,2,3,4,5,6,7,1,2,3,4]
。
我想检查l1
是l2
中的子集,如果是{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]
。
答案 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的解决方案比这更好。