2017-02-14 29 views
0

Siehe unten für den genauen Code. Im Grunde versuche ich, Informationen aus einer CSV-Datei zu nehmen und eine Liste mit einer der Spalten zu erstellen, die alle Benutzernamen enthält (ohne Leerzeichen oder Duplikate). Ich bin in der Lage, eine Liste aller Benutzernamen zu bekommen, aber ich finde keine Möglichkeit, die Lücken zu entfernen. Ich habe sowohl Filter als auch andere Methoden ausprobiert, aber es scheint nicht richtig zu sein. Mein Code ist:Entfernen Sie leere verschachtelte Listen in der Liste

with open('test.csv') as f: 
reader = csv.DictReader(f) 
initialExport = [] 
for row in reader: 
    iE = [row['Computer Name'], row['Username']] 
    initialExport.append(iE) 

for i in initialExport: 
    i.pop(0) 
finalExport = filter(None, initialExport) 
print(finalExport) 
+0

tun Sie leere Benutzernamen oder Leerzeichen entfernen möchten ? –

+0

Können Sie ein Beispiel für gute und schlechte Eingaben posten? – TemporalWolf

Antwort

1

Anstatt es Ausfiltern, warum nur zu vermeiden, nicht leere Einträge in erster Linie hinzugefügt:

for row in reader: 
    if row['Username']: 
     iE = [row['Computer Name'], row['Username']] 
     initialExport.append(iE) 
1

initialExport ist eine Liste von (Singleton) Listen, wenn Sie versuchen zu filtern Sie. Einige dieser Listen enthalten möglicherweise die leere Zeichenfolge. Das macht sie nicht zu leeren Listen! Also ist ihre Wahrheit wahr, egal was passiert. Man könnte sie herauszufiltern über:

finalExport = [l for l in initialExport if l[0]] 

Aber warum die Computer Name Spalte an erster Stelle hinzufügen, wenn Sie es nur Pop? Und warum eine verschachtelte Liste machen, wenn Sie in einem Elemente nur Interesse:

finalExport = [row['Username'] for row in reader if row['Username']] 
+0

Entschuldigung, ich hätte erklären sollen - ich werde 'Computername' verwenden, aber nicht in diesem Beispiel. Das Feld Computername ist immer noch relevant, aber ich habe einfach eine Methode getestet, um nur die Benutzernamen anzuzeigen (ohne Leerzeichen). – Neemaximo

0

Dies zeigt eine Art und Weise leere Listen, leere Tupel und Listen zu entfernen, nur leere Listen von lst enthalten. Der folgende Code wird nicht entfernen:

  • leer verschachtelte Tupel (mit einer oder mehreren Stufen)
  • leer verschachtelten Listen mit mehr als zwei Ebenen

verleihen die letzten beiden Eintragungen der LST.

import collections 

lst = [1, 2, "3", "three", [], [1, 2, "3"], [[], []], 4, 
     [[1], []], [[], [], []], 5, "6", (1,2), 7,(), 
     ((),()), [[[]]]] 

for index, item in enumerate(lst): 
    # if it is an empty list [] or tuple() 
    if not item: 
     del lst[index] 
    # if it is a list containing only empty sublists [[], [], ...] 
    elif isinstance(item, collections.MutableSequence): 
     if not [i for sublist in item for i in sublist]: 
      del lst[index] 

print(lst) 

Output:

[1, 2, '3', 'three', [1, 2, '3'], 4, [[1], []], 5, '6', (1, 2), 7, ((),()), [[[]]]] 

Vier Elemente von LST in dem obigen Beispiel entfernt werden, nämlich [], [[], []], [[], [] []] und().

0

purge(list, [elements to purge]) werden alle Kopien von element aus der Liste und alle Teil-Listen rekursiv löschen, indem tiefere Elemente erstellt irgendwelchen Elementen, einschließlich ([[[], []]] wird vollständig entfernt werden). Weil wir die Liste an Ort und Stelle sind zu modifizieren, müssen wir auf unsere aktuellen Tiefe neu starten jedes Mal, entfernen wir ein Element:

def purge(lst, bad): 
    restart = True 
    while restart: 
     restart = False 
     for index, ele in enumerate(lst[:]): 
      if ele in bad: 
       del lst[index] 
       restart = True 
       break 
      elif isinstance(ele, list): 
       purge(ele, bad) 
       if lst[index] in bad: 
        del lst[index] 
        restart = True 
        break 

Beispiele:

>>> lst = [[[[], [[],[]]]]] 
>>> purge(lst, [[]]) 
[] 

>>> lst = [1, 2, "3", "three", [], [1, 2, "3"], [[], []], 4, 
     [[1], []], [[], [], []], 5, "6", (1,2), 7, [[[]]]] 
>>> purge(lst, [[]]) 
[1, 2, '3', 'three', [1, 2, '3'], 4, [[1]], 5, '6', (1, 2), 7] 
>>> purge(lst, ['3']) 
[1, 2, 'three', [1, 2], 4, [[1]], 5, '6', (1, 2), 7] 
Verwandte Themen