2016-06-27 5 views
-1

ich eine Liste von Strings, die wie folgt aussehen:Python: Filter eine Liste von Strings basierend auf einem String-Namen

li1 = ['pin 2.3','vlo 5.4', 'lu 1.3', '3 packages installed', '', 'bla'] 

l12 = ['pin 2.3','vlo 5.4', '2 packages installed', 'bla', 'bla'] 

ich aus den Listen herausfiltern möchten die Strings ‚X-Pakete installiert‘ und diejenigen, das folgende zu haben:

out1 = ['pin 2.3','vlo 5.4', 'lu 1.3'] 


out2 = ['pin 2.3','vlo 5.4'] 

Wie kann ich das mit List Verständnis tun? Dank

Antwort

6

Sie itertools.takewhile verwenden können, die Elemente aus der Liste dauert, bis die vorgegebene Bedingung nicht bestanden:

from itertools import takewhile 

l12 = ['pin 2.3','vlo 5.4', '2 packages installed', 'bla', 'bla'] 
li1 = ['pin 2.3','vlo 5.4', 'lu 1.3', '3 packages installed', '', 'bla'] 



r12 = takewhile(lambda x: "packages installed" not in x, l12) 
ri1 = takewhile(lambda x: "packages installed" not in x, li1) 
print(list(r12)) 
# ['pin 2.3', 'vlo 5.4'] 

print(list(ri1)) 
# ['pin 2.3', 'vlo 5.4', 'lu 1.3'] 
+0

Das funktioniert sehr gut, vielen Dank! – diegus

+2

Kann für diese Frage übertrieben sein. –

+2

@MoonCheesez würde ich auch so denken. Aber dies stoppt, sobald die Bedingung im Gegensatz zu einem Listenverständnis fehlschlägt –

1

Etwas einfach:

li1 = ['pin 2.3','vlo 5.4', 'lu 1.3', '3 packages installed', '', 'bla'] 

out1 = [] 
for x in li1: 
    if "packages installed" in x: 
     break 
    out1.append(x) 

print(out1) 
# ['pin 2.3', 'vlo 5.4', 'lu 1.3'] 

Edit: Es scheint, wie ich eine bin ein bisschen spät.

-1

itertools.takewhile funktioniert gut, wenn Sie eine neue Liste möchten. Um die ursprüngliche Liste in-place ändern Sie tun können:

>>> L = ['pin 2.3','vlo 5.4', '2 packages installed', 'bla-bla'] 
>>> for i, v in enumerate(L): 
...  if "packages installed" in v: 
...   del L[i:] 
...   break 
... 
>>> L 
['pin 2.3', 'vlo 5.4'] 
Verwandte Themen