Filtern einer Liste von Zeichenfolgen basierend auf Inhalten

93

Angesichts der Liste ['a','ab','abc','bac']möchte ich eine Liste mit Zeichenfolgen berechnen, die 'ab'darin enthalten sind. Dh das Ergebnis ist ['ab','abc']. Wie geht das in Python?

Chris.Jie
quelle

Antworten:

159

Diese einfache Filterung kann mit Python auf viele Arten erreicht werden. Der beste Ansatz besteht darin, "Listenverständnis" wie folgt zu verwenden:

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

Eine andere Möglichkeit besteht darin, die filterFunktion zu verwenden. In Python 2:

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

In Python 3 wird anstelle einer Liste ein Iterator zurückgegeben , aber Sie können ihn umwandeln:

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

Es ist jedoch besser, ein Verständnis zu verwenden.

Eli Bendersky
quelle
30
@ S.Lott: warum? Was ist falsch daran, nützliche fortgeschrittene Programmierthemen in einem geeigneten Kontext zu lernen?
Eli Bendersky
12
@ S.Lott: Ich denke, Lambdas erleichtern die Betrachtung von Funktionen als erstklassige Objekte, was für einige Programmierparadigmen wichtig ist. Ich würde nicht sagen, dass sie für mich sehr wichtig sind , aber ich glaube, dass selbst Neulinge davon profitieren können, wenn sie über das Programmieren auf diese Weise nachdenken, und es definitiv nicht als Zufügung bezeichnen würden .
Eli Bendersky
6
@ S.Lott: aber ist in diesem Fall nicht lambdader perfekte Begleiter filter? Ich denke, dass das Schreiben einer separaten Funktion nur zum Überprüfen, ob sie abin der angegebenen Liste enthalten ist, ein Overkill ist. Schreiben Sie also eine allgemeinere Funktion, die den inOperator grundsätzlich umschließt . Wie würden Sie filterohne lambdahier klarer verwenden ?
Eli Bendersky
5
Es sind nicht nur n00bs, die diese Antwort finden
Bryan
9
Ich bin ein n00b und jetzt bin ich mit Lambda bekannt. Ich fühle mich großartig, es zu wissen. Jetzt werde ich mehr darüber erfahren.
a_secenthusiast
16
[x for x in L if 'ab' in x]
Ignacio Vazquez-Abrams
quelle
15
# To support matches from the beginning, not any matches:

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

filter(lambda x: x.startswith(prefix), items)
Itay Maman
quelle
Vermeiden Sie Listen als Variablennamen, da dies ein Python-Objekttyp ist.
Rutger Hofste
6

Versuchte dies schnell in der interaktiven Shell:

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

Warum funktioniert das? Weil der inOperator so definiert ist, dass Zeichenfolgen bedeuten: "ist Teilzeichenfolge von".

Möglicherweise möchten Sie auch die Schleife ausschreiben, anstatt die oben verwendete Listenverständnis-Syntax zu verwenden:

l = ['a', 'ab', 'abc', 'bac']
result = []
for s in l:
   if 'ab' in s:
       result.append(s)
Daren Thomas
quelle
-2
mylist = ['a', 'ab', 'abc']
assert 'ab' in mylist
Yann Ramin
quelle