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:
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 filter
fonction. 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.
lambda
le compagnon idéal filter
dans ce cas? Je pense qu'écrire une fonction séparée juste pour vérifier si elle ab
figure 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' in
opérateur. Comment l'utiliseriez-vous filter
d'une manière plus claire sans lambda
ici?
[x for x in L if 'ab' in x]
# To support matches from the beginning, not any matches:
items = ['a', 'ab', 'abc', 'bac']
prefix = 'ab'
filter(lambda x: x.startswith(prefix), items)
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' in
opé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)
mylist = ['a', 'ab', 'abc']
assert 'ab' in mylist