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?
102
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éalfilter
dans ce cas? Je pense qu'écrire une fonction séparée juste pour vérifier si elleab
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-vousfilter
d'une manière plus claire sanslambda
ici?[x for x in L if 'ab' in x]
la source
# To support matches from the beginning, not any matches: items = ['a', 'ab', 'abc', 'bac'] prefix = 'ab' filter(lambda x: x.startswith(prefix), items)
la source
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)
la source
mylist = ['a', 'ab', 'abc'] assert 'ab' in mylist
la source