2016-07-12 3 views
1

У меня есть список списков, и я бы хотел удалить все вложенные списки, которые содержат любое из нескольких значений.Удалите вложенный список, если найдено какое-либо из нескольких значений

list_of_lists = [[1,2], [3,4], [5,6]] 
indices = [i for i,val in enumerate(list_of_lists) if (1,6) in val] 

print(indices) 
[0] 

Я хотел бы списки индексов, где это условие так, что я могу:

del list_of_lists[indices] 

Чтобы удалить все вложенные списки, которые содержат определенные значения. Я предполагаю, что проблема заключается в том, где я пытаюсь проверить несколько значений (1,6) при использовании либо 1, либо 6 работ.

ответ

3

Вы можете использовать операцию набора:

if not {1, 6}.isdisjoint(val) 

Набор не пересекается, если ни одно из значений не появляются в другой последовательности или набор:

>>> {1, 6}.isdisjoint([1, 2]) 
False 
>>> {1, 6}.isdisjoint([3, 4]) 
True 

Или просто проверить оба значения:

if 1 in val or 6 in val 

Я не собирал список индексов. Просто восстановить список и фильтр из что вы не хотите в новом списке:

list_of_lists[:] = [val for val in list_of_lists if {1, 6}.isdisjoint(val)] 

Сопоставляя целый срез [:] заменить все индексы в list_of_lists, обновляя список объекты в месте :

>>> list_of_lists = [[1, 2], [3, 4], [5, 6]] 
>>> another_ref = list_of_lists 
>>> list_of_lists[:] = [val for val in list_of_lists if {1, 6}.isdisjoint(val)] 
>>> list_of_lists 
[[3, 4]] 
>>> another_ref 
[[3, 4]] 

См What is the difference between slice assignment that slices the whole list and direct assignment? более подробно о том, что присвоившей срезу делает.

+0

Ничего себе, это здорово. Я не знал о назначении срезов. В случае, если кто-то еще хочет больше узнать об этом - http://stackoverflow.com/a/10155987/2694260 – Bprodz

+1

@Bprodz: ах, это действительно хорошая ссылка для использования. :-) –