2016-12-24 8 views
3

Ich habe diese Art von Liste der Liste (nur zwei verschachtelte Ebene):löschen Elemente aus der Liste der Liste: pythonic Weg

my_list = [['A'], ['B'], ['C','D','A','B'], ['E'], ['B', 'F', 'G'], ['H']]

ich eine Liste der Elemente habe in my_list zu löschen:

to_del = ['A','B']

das ist meine Vorstellung von Code to_del Elemente aus my_list zu löschen:

for i in my_list: 
    for d in to_del: 
     if d in i: 
      i.remove(d) 

Ausgang: [[], [], ['C', 'D'], ['E'], ['F', 'G'], ['H']]

meine Fragen hier:

  • Können Sie sich eine pythonic/elegante Art und Weise legen nahe, die gleichen
  • Können Sie eine intelligente Art und Weise zu tun, um die Anzahl der verschachtelten zu verallgemeinern Ebenen zB my_list = [ ['A'], ['B'], ['C', ['D', 'E', ['F']], 'G'], ['H'] ]
  • Die ideale Methode hat ein boolesches Argument empty_lists, um zu entscheiden, ob Sie leere Listen behalten oder nicht.
+2

Möchten Sie die leeren Listen behalten? – fafl

+0

Sie haben das bemerkt. Nun, die ideale Methode hat ein boolesches Argument 'empty_lists', um zu entscheiden, ob die leeren Listen beibehalten werden sollen. – enneppi

+0

Willkommen bei [so]. Wir haben eine Bearbeitungshistorie für diejenigen, die wirklich daran interessiert sind, wie sich der Beitrag im Laufe der Zeit entwickelt hat, so dass es nicht nötig ist, "EDIT:" einzugeben. Sie sollten immer neue Informationen integrieren, um einen einzigen kohärenten Beitrag zu erstellen, anstatt Informationen lückenlos zu markieren und den Beitrag schwieriger zu lesen als nötig. Und wenn Sie wirklich auf etwas aufmerksam machen müssen, SCHREIEN SIE NICHT, sondern verwenden Sie ** fett ** oder * kursiv *. – Anthon

Antwort

3

Mit verschachtelten Liste Comprehensions:

[[y for y in x if y not in to_del] for x in my_list] 

Mit Liste Verständnis und Lambda-Filter:

[filter(lambda y: y not in to_del, x) for x in my_list] 

Ein Versuch, für den allgemeinen Fall beliebig Listen verschachtelt:

def f(e): 
    if not isinstance(e,list): 
     if e not in to_del: 
      return e 
    else: 
     return filter(None,[f(y) for y in e]) 

to_del = ['A','B'] 
my_list= [['A'], ['B',['A','Z', ['C','Z','A']]], ['C','D','A','B'],['E'], ['B','F','G'], ['H']] 

>>> f(my_list) 
[[['Z', ['C', 'Z']]], ['C', 'D'], ['E'], ['F', 'G'], ['H']] 
+1

ich mag es. für den speziellen Fall von zwei verschachtelten Levels, gelöst mit: 'list (filter (None, [[s für s in Unterliste, wenn nicht in to_del] für Unterliste in my_list]))'. eine Frage: Sie sollten 'f' nicht mit' list (f (my_list)) 'werfen, da es einen Iterator zurückgibt? – enneppi

+0

@Nicola Python 2 gibt eine Liste zurück ... sieht so aus, als wäre es an der Zeit für mich, zu Python 3 zu wechseln – user2314737

6

Try Liste Verständnis:

my_list = [[x for x in sublist if x not in to_del] for sublist in my_list] 

Ausgang:

>>> my_list 
[[], [], ['C', 'D'], ['E'], ['F', 'G'], ['H']] 
Verwandte Themen