2016-11-14 2 views
2

Я пытаюсь удалить все внешние элементы списка, которые содержатся во втором списке, сохраняя при этом те, которые могут быть «зажаты» внутри. Я знаю, как взять дополнение к пересечению двух наборов, но здесь я просто хочу удалить все начальные и конечные элементы. До сих пор я придумал в следующем, но он чувствует себя неуклюжим:Снять внешние элементы из списка, которые содержатся в другом списке

def strip_list(l, to_remove): 
    while l[0] in to_remove: 
     l.pop(0) 
    while l and l[-1] in to_remove: 
     l.pop(-1) 
    return l 

mylist = ['one', 'two', 'yellow', 'one', 'blue', 'three', 'four'] 
nums = ['one', 'two', 'three', 'four'] 
strip_list(mylist, nums) 
# > ['yellow', 'one', 'blue'] 
+0

'набор (my_list) - набор (НУМС)'? – sytech

+1

@sytech, который удалил бы также дубликаты, которые должны быть оставлены – Uriel

+2

Возможный дубликат [Удалить все элементы, которые происходят в одном списке от другого] (http://stackoverflow.com/questions/4211209/remove-all-the-elements- что-происходит-в-одном-list-from-another) – damores

ответ

1
def strip_list(data, to_remove): 
    idx = [i for i, v in enumerate(data) if v not in to_remove] 
    return data[idx[0]:idx[-1]+1] 
+0

lol, я работаю над точно такой же частью кода, это не удастся, если все элементы из списка ввода совпадут внутри списка to_remove – Skycc

+1

изменить возврат к возврату данных [idx [0]: idx [-1] +1], если idx else [], тогда должно быть совершенным – Skycc

Смежные вопросы