2017-03-19 11 views
0

예 : 목록이 있습니다. l1 = [1,2,3,4] 및 다른 목록 : l2 = [1,2,3,4,5,6,7,1,2,3,4]. l1l2의 하위 집합인지 확인하고 싶다면 l2에서 이러한 요소를 삭제하고 l2[5,6,7,1,2,3,4]이되고 인덱스 0-3이 제거되었습니다.목록에서 하위 목록 제거

이 작업을 수행 할 파이썬 방법이 있습니까? I 출력을하고자하지만

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

'나는 (i가 l1이 아니거나 l2가 아니라면 l1 + l2 일 때)'나는 이것이 네가 필요로하는 전부라고 생각한다. –

답변

2

음, 여기는 무차별 적입니다. 아마 더 효율적인 방법이 있습니다. 일치하는 하위 목록을 조기에 만나기를 원하면 성능이 끔직하지 않아야합니다.

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

나는이 자랑 아니에요, 그것은 파이썬 아니지만, 나는 그것이 될 줄 알았는데을 쓸 재미가 조금 있습니다. 나는 조금 더 명백한 일이 일어나도록 코드에 주석을 달았다.

>>> 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의 솔루션은 이것보다 훨씬 더 좋습니다.