2010-01-28 12 views
45

Angesichts der Liste ['a','ab','abc','bac'], ich möchte eine Liste mit Zeichenfolgen, die 'ab' in ihnen haben. I.e. das Ergebnis ist ['ab','abc']. Wie kann das in Python gemacht werden?Filtern einer Liste von Strings basierend auf dem Inhalt

+0

dank Eli Bendersky –

+0

die Liste [‘Gegeben a ',' b ',' c ',' a ',' b '], ich möchte eine Liste mit Strings berechnen, die' a 'und' b 'enthalten. I.e. Das Ergebnis ist ['a', 'b']. Wie kann das in Python gemacht werden? –

Antwort

71

Diese einfachen Filterung kann in vielerlei Hinsicht mit Python erreicht werden. Der beste Ansatz ist "Listenkomprehensionen" wie folgt zu verwenden:

>>> lst = ['a', 'ab', 'abc', 'bac'] 
>>> res = [k for k in lst if 'ab' in k] 
>>> res 
['ab', 'abc'] 
>>> 

Eine andere Möglichkeit ist es, die filter Funktion zu verwenden:

>>> filter(lambda k: 'ab' in k, lst) 
['ab', 'abc'] 
>>> 
+0

-1: Lambda. Bitte fügen Sie Lambda auf n00bs nicht hinzu. –

+26

@ S.Lott: warum? Was ist falsch daran, nützliche fortgeschrittene Programmthemen in einem geeigneten Kontext zu lernen? –

+0

@Edi Bendersky: Weil sie verwirrender als nützlich sind? Weil es zu Fragen führt, die mit "def def" beantwortet werden? Weil es selten zu etwas Besserem als Code-Golf führt? Ich weiß nicht, sie scheinen mir nutzlos, nach 30 Jahren Programmierung in einer Vielzahl von Sprachen. Aber ich denke, dass sie dir wirklich wichtig sind. –

12
[x for x in L if 'ab' in x] 
+0

Sie gewinnen um 48 Sekunden :-) –

3

dies in der interaktiven Shell schnell Ausprobiert:

>>> l = ['a', 'ab', 'abc', 'bac'] 
>>> [x for x in l if 'ab' in x] 
['ab', 'abc'] 
>>> 

Warum funktioniert das? Weil die in operator für Zeichenfolgen definiert ist, bedeutet: "ist Teilzeichenfolge von".

Auch sollten Sie die Schleife Schreiben aus zu betrachten, im Gegensatz zu den list comprehension syntax verwendet, um oben:

l = ['a', 'ab', 'abc', 'bac'] 
result = [] 
for s in l: 
    if 'ab' in s: 
     result.append(s) 
0
mylist = ['a', 'ab', 'abc'] 
assert 'ab' in mylist 
5
# To support matches from the beginning, not any matches: 

list = ['a', 'ab', 'abc', 'bac'] 
prefix = 'ab' 

filter(lambda x: x.startswith(prefix), list) 
Verwandte Themen