2017-03-19 21 views
0

私はリストを持っています。 l1 = [1,2,3,4]と別のリスト:l2 = [1,2,3,4,5,6,7,1,2,3,4]。 私はl1l2でサブセットであるかどうかを確認したいと思いますし、それがある場合は、その後、私はインデックス0-3が削除されている[5,6,7,1,2,3,4]を、なるようにl2l2ことから、これらの要素を削除します。リストからサブリストを削除する

これを行うためのpythonicの方法はありますか?

私はこの試みた:私は出力が[5,6,7,1,2,3,4]になりたいしかし

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] 

を。

+0

'[私は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のソリューションはこれにはるかに望ましいです。

関連する問題