2016-07-12 28 views
1

Ich habe eine Liste von Listen und möchte alle verschachtelten Listen entfernen, die mehrere Werte enthalten.Entfernen Sie eine verschachtelte Liste, wenn einer von mehreren Werten gefunden wird

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] 

würde ich eine Liste von Indizes wie, wo diese Bedingungen so ist, dass ich kann:

del list_of_lists[indices] 

alle verschachtelten Listen zu entfernen, die bestimmte Werte enthalten. Ich vermute, das Problem ist, wo ich versuche, gegen mehrere Werte (1,6) als entweder 1 oder 6 funktioniert zu überprüfen.

Antwort

3

Sie könnten eine Set-Operation verwenden:

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

Ein Satz disjunkt ist, wenn keiner der Werte in der anderen Reihenfolge erscheinen oder eingestellt:

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

Oder gerade testen Sie beide Werte:

if 1 in val or 6 in val 

Ich würde keine Liste von Indizes erstellen. Nur die Liste wieder aufzubauen und filtern aus alles, was Sie wollen nicht in der neuen Liste:

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

Durch zum [:] ganze Scheibe zuweisen Sie alle Indizes in list_of_lists ersetzen, die Aktualisierung der Liste Objekt in-place :

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

Siehe auf weitere Einzelheiten What is the difference between slice assignment that slices the whole list and direct assignment? was Zuordnung zu einer Scheibe der Fall ist.

+0

Wow, das ist großartig. Ich wusste nichts über das Zuweisen von Slices. Falls jemand anderes mehr darüber lesen möchte - http://stackoverflow.com/a/10155987/2694260 – Bprodz

+1

@Bprodz: Ah, das ist in der Tat eine nette Referenz zu verwenden. :-) –