2017-03-19 4 views
0

J'ai une liste par ex. l1 = [1,2,3,4] et une autre liste: l2 = [1,2,3,4,5,6,7,1,2,3,4]. Je voudrais vérifier si l1 est un sous-ensemble dans l2 et si elle est, alors je veux supprimer ces éléments de l2 tels que l2 deviendrait [5,6,7,1,2,3,4], où les indices 0-3 ont été supprimés.Suppression d'une sous-liste d'une liste

Existe-t-il une façon pythonique de le faire?

J'ai essayé ceci:

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] 

Cependant, je voudrais que la sortie soit [5,6,7,1,2,3,4].

+0

'[i pour moi en l1 + l2 si (je ne suis pas en l1) ou (je ne suis pas en l2)]' Je pense que c'est tout ce dont vous avez besoin –

Répondre

2

Eh bien, voici un moyen de force brute. Il y a probablement des moyens plus efficaces. Si vous pensez rencontrer une sous-liste correspondante au début, la performance ne devrait pas être terrible.

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

Ou si vous ne voulez pas modifier l2, vous pouvez effectuer les opérations suivantes:

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

Je ne suis pas fier, et ce n'est pas pythonique, mais je pensais que ce serait peut-être un peu de plaisir à écrire. J'ai annoté le code pour rendre un peu plus évident ce qui se passe.

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

La sortie ici est un tuple, mais vous pouvez l'envelopper dans list() si c'est ce que vous voulez vraiment. Encore une fois, je ne suis pas fier de cela, mais cela fonctionne au moins pour ce cas simple. La solution de Juanpa est beaucoup plus préférable à cela.