2016-07-12 16 views
0

ich eine 2d Liste von Zeichenketten in der Form habenErstellen einer Liste/eine Zeile aus einer Liste zu entfernen, wenn eine Zeichenfolge in der Liste existieren

data = [['DAL', "Luna's", 'Dallas', 'TX', '75235-3013', 'US', 40162.0, 'CFSAN', 'Pesticides and Chemical Contaminants'], 
     ['DAL', "Luna's", 'Dallas', 'TX', '75235-3013', 'US', 41033.0, 'CFSAN', 'Foodborne Hazards']] 

Wenn eine Zeile in meiner Liste enthält die Zeichen „Food“, Wie in diesem Fall Lebensmittelgefährdungen, möchte ich, dass es von der Liste gestrichen wird. Dies kann entweder durch Entfernen der Zeile aus der Liste oder durch Erstellen einer neuen Liste erfolgen, wenn diese nicht "Essen" enthält.

Ich versuchte, Liste Liste Verständnis unten aufzuführen, aber es hat nicht funktioniert.

filtered_data = [[data[i,j] for j in range(len(data[0]))] for i in range(len(data)) if 'Food' in data[i,:]] 

Könnte jemand mich in die richtige Richtung lenken?

+0

Ziemlich sicher, dass Sie es wollen * eliminiert * von der Liste. –

+0

@DanHydar oops. Guter Fang. – Jstuff

Antwort

3

Dies ist ein Job für filter. Comprehensions könnte den gleichen Trick tun, aber ich finde, dass map/filter/reduce immer einfacher Code zu lesen:

def my_food_filter(inner_list): 
    return not any(['Food' in str(p) for p in inner_list]) 

foodless_list = filter(my_food_filter, data) 
+0

'Funktion' Objekt ist nicht iterierbar –

+1

@OhadtheLad hey, netter Fang, ich habe die Parameter umgekehrt, um zu filtern. Versuch es noch mal, ja? Das ist das Ergebnis der "Codierung" direkt zu SO. – smassey

+0

@massie foodless_list wird nie erklärt. Liegt es daran, dass in der letzten Zeile etwas in my_food_filter übergeben werden sollte? Was genau passiert mit der Rückgabe nicht? Ich habe es noch nie zuvor gesehen. Danke – Jstuff

1
thelist[:] = [x for x in thelist if 'Food' not in str(x)] 

u diesen während verwenden u über die Liste iterieren - u'd nie aus dem Indexfehler erhalten

Zusatz-Infos für zwei verschachtelte lists- Ihren Fall:

for singlelist in data: 
    singlelist[:] = [x for x in singlelist if 'Food' not in str(x)] 
print data 
2
[[y for y in x if 'Food' not in str(y)] for x in data] 

Input: Daten Ausgang:

[['DAL', "Luna's", 'Dallas', 'TX', '75235-3013', 'US', 40162.0, 'CFSAN', 'Pesticides and Chemical Contaminants'], ['DAL', "Luna's", 'Dallas', 'TX', '75235-3013', 'US', 41033.0, 'CFSAN']] 

wenn Sie die Liste löschen möchten, enthält ' Food‘, versuchen Sie dies:

[x for x in data if 'Food' not in str(x)] 

Ausgang:

[['DAL', "Luna's", 'Dallas', 'TX', '75235-3013', 'US', 40162.0, 'CFSAN', 'Pesticides and Chemical Contaminants']] 
+0

Ich möchte löschen die gesamte Zeichenfolge entfernen, wenn die Zeichenfolge in einer beliebigen Spalte in der Zeichenfolge vorhanden ist. Ich habe versucht, Ihre Methode und es löschte nur die Spalte der Zeichenfolge, die "Essen" enthält – Jstuff

+0

Das Endergebnis der oben genannten Liste wäre ["DAL", "Luna", "Dallas", "TX", "75235-3013" , 'US', 40162.0, 'CFSAN', 'Pestizide und chemische Kontaminanten'] – Jstuff

+0

In diesem Fall '[[x für x in Daten, wenn' Nahrung 'nicht in str (x)]]' –

Verwandte Themen