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?

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.


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


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

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

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

é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)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.