2012-07-31 7 views
10

nehme ichGibt es einen Weg, um zwei zu verwenden, wenn die Bedingungen in Listenkomprehensionen in Python

my_list = ['91 9925479326','18002561245','All the best','good'] 

nun eine Liste hatte ich die Strings in der Liste, beginnend mit 91 und 18 wie unter

result = [] 
for i in my_list: 
    if not '91' in i: 
     if not '18' in i: 
     result.append(i) 
ignorieren will

Also hier möchte ich dies mit List Comprehensions erreichen. Gibt es sowieso zwei zu schreiben, wenn Bedingungen in Listenkompressen?

Kann jemand mir bitte mitteilen, wie oben zu tun mit Listenkomprehensionen

Vielen Dank im Voraus ............

+0

@jamylak: Ich hatte genommen, dass als Beispiel trotzdem danke für die Bearbeitung. –

+5

Achten Sie darauf, dass Ihre Tests nur prüfen, ob '91' und' 18' in _einer_ Position der Zeichenfolge vorhanden sind. Sie sollten stattdessen 'str.startswith' verwenden: http://docs.python.org/library/stdtypes.html#str.startswith –

Antwort

14
[i for i in my_list if '91' not in i and '18' not in i] 

Hinweis Sie nicht list verwenden sollten als Variablenname schattiert er die eingebaute Funktion.

+1

(+1) für eine korrekte Antwort und zum Ändern von' not '91' in i' zu 91 nicht in mir. – mgilson

+0

Diese Antwort wird nicht so präzise und sauber, sobald Sie fünf von zehn anstelle von zwei Werten zu überprüfen haben. –

+0

Können wir das selbe mit startwith Funktion tun, weil manchmal die Liste aus den Strings besteht, die mit 91 beginnen und manchmal mit 18 beginnen, was auch immer die Strings sein mögen, die mit 91 oder 18 beginnen, sollten aus der Liste ignoriert werden sind Telefonnummern 91 9885564213 und 1800 3236 2365 –

1

Sie können „merge“ beide Bedingungen:

if ((not '91' in i) and (not '18' in i)) 
+3

Oder vereinfachen mit [DeMorgan's Law] (http://en.wikipedia.org/wiki/De_Morgan%27s_laws):' wenn nicht ('91' in i oder '18' in i) – Blckknght

7

Wenn Sie mehr als zwei Werte (91 und 18) oder sie produziert werden dynamisch es ist besser, diese Konstruktion zu verwenden:

[i for i in my_list if not i.startswith(('91', '18'))] 

Oder wenn Sie überprüfen möchten, ob 91 und 18 in die Saiten sind (nicht nur am Anfang), verwenden in statt startswith:

[i for i in my_list if all(x not in i for x in ['91', '18'])] 

Anwendungsbeispiel:

>>> my_list = ['91 9925479326','18002561245','All the best','good'] 
>>> [i for i in my_list if all(not i.startswith(x) for x in ['91', '18'])] 
['All the best', 'good'] 
>>> 
+1

bevorzuge ich: '[i für i in meiner_liste wenn nicht (i.Startswith (x) für x in [' 91 ',' 18 '])] 'aber ich denke, es ist persönliche Präferenz – jamylak

+1

' .startswith' akzeptiert auch ein Tupel von Strings, so kann es zu '[i für i in my_list wenn nicht i.startswith ((' 91 ',' 18 '))] '' verkürzt werden . – MRAB

+0

@MRAB: Danke für den perfekten Hinweis! Ich habe die Antwort aktualisiert und ihr die Variante hinzugefügt. Vielen Dank –

Verwandte Themen