Filtrer une liste de chaînes en fonction du contenu

102

Compte tenu de la liste ['a','ab','abc','bac'], je veux calculer une liste avec des chaînes qui contiennent 'ab'. Ie le résultat est ['ab','abc']. Comment cela peut-il être fait en Python?

Chris.Jie
la source

Réponses:

170

Ce filtrage simple peut être réalisé de plusieurs manières avec Python. La meilleure approche consiste à utiliser les «compréhensions de liste» comme suit:

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

Une autre façon est d'utiliser la filterfonction. Dans Python 2:

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

Dans Python 3, il renvoie un itérateur au lieu d'une liste, mais vous pouvez le caster:

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

Bien qu'il soit préférable d'utiliser une compréhension.

Eli Bendersky
la source
30
@ S.Lott: pourquoi? Quel est le problème avec l'apprentissage de sujets de programmation avancés utiles dans un contexte approprié?
Eli Bendersky
12
@ S.Lott: Je pense que les lambdas facilitent la prise en compte des fonctions comme des objets de première classe, ce qui est important pour certains paradigmes de programmation. Je ne dirais pas qu'ils sont très importants pour moi , mais je pense que même les débutants peuvent bénéficier de penser à la programmation de cette façon, et je n'appellerais certainement pas cela infliger .
Eli Bendersky
6
@ S.Lott: mais n'est pas lambdale compagnon idéal filterdans ce cas? Je pense qu'écrire une fonction séparée juste pour vérifier si elle abfigure dans la liste donnée est une exagération. Il en va de même pour l'écriture d'une fonction plus générale qui encapsule essentiellement l' inopérateur. Comment l'utiliseriez-vous filterd'une manière plus claire sans lambdaici?
Eli Bendersky
5
Ce ne sont pas seulement les n00bs qui trouvent cette réponse
Bryan
9
Je suis un n00b et maintenant je suis présenté à lambda. se sentir génial de le savoir. maintenant je vais en apprendre plus à ce sujet.
a_secenthusiast
17
[x for x in L if 'ab' in x]
Ignacio Vazquez-Abrams
la source
16
# 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
la source
évitez list comme nom de variable car il s'agit d'un type d'objet python.
Rutger Hofste
6

Essayé ceci rapidement dans le shell interactif:

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

Pourquoi ça marche? Parce que l' inopérateur est défini pour que les chaînes signifient: "est une sous-chaîne de".

En outre, vous pouvez envisager d'écrire la boucle au lieu d'utiliser la syntaxe de compréhension de liste utilisée ci-dessus:

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