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?

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.


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


15
# To support matches from the beginning, not any matches:

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

filter(lambda x: x.startswith(prefix), items)

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)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.