139 votes

Recherche d'une sous-chaîne dans une liste en Python

Le contexte :

Liste d'exemples : mylist = ['abc123', 'def456', 'ghi789']

Je veux récupérer un élément s'il y a une correspondance pour une sous-chaîne, par exemple abc

Code :

sub = 'abc'
print any(sub in mystring for mystring in mylist)

les impressions ci-dessus True si l'un des éléments de la liste contient le motif.

Je voudrais imprimer l'élément qui correspond à la sous-chaîne. Ainsi, si je vérifie 'abc' Je veux seulement imprimer 'abc123' de la liste.

172voto

David Robinson Points 33371
print [s for s in list if sub in s]

Si vous voulez qu'ils soient séparés par des retours à la ligne :

print "\n".join(s for s in list if sub in s)

Exemple complet, avec insensibilité à la casse :

mylist = ['abc123', 'def456', 'ghi789', 'ABC987', 'aBc654']
sub = 'abc'

print "\n".join(s for s in mylist if sub.lower() in s.lower())

74voto

Frank Zalkow Points 2565

Toutes les réponses fonctionnent mais elles parcourent toujours la liste entière. Si je comprends bien votre question, vous n'avez besoin que de la première correspondance. Vous n'avez donc pas besoin de considérer le reste de la liste si vous avez trouvé votre première correspondance :

mylist = ['abc123', 'def456', 'ghi789']
sub = 'abc'
next((s for s in mylist if sub in s), None) # returns 'abc123'

Si la correspondance se trouve à la fin de la liste ou pour de très petites listes, cela ne fait pas de différence, mais considérez cet exemple :

import timeit

mylist = ['abc123'] + ['xyz123']*1000
sub = 'abc'

timeit.timeit('[s for s in mylist if sub in s]', setup='from __main__ import mylist, sub', number=100000)
# for me 7.949463844299316 with Python 2.7, 8.568840944994008 with Python 3.4
timeit.timeit('next((s for s in mylist if sub in s), None)', setup='from __main__ import mylist, sub', number=100000) 
# for me 0.12696599960327148 with Python 2.7, 0.09955992100003641 with Python 3.4

25voto

unutbu Points 222216

Utilisez un simple for boucle :

seq = ['abc123', 'def456', 'ghi789']
sub = 'abc'

for text in seq:
    if sub in text:
        print(text)

donne

abc123

13voto

oathead Points 452

J'utiliserais juste une simple regex, vous pouvez faire quelque chose comme ça

import re
old_list = ['abc123', 'def456', 'ghi789']
new_list = [x for x in old_list if re.search('abc', x)]
for item in new_list:
    print item

12voto

Hyperboreus Points 15985

Cela imprime tous les éléments qui contiennent sub :

for s in filter (lambda x: sub in x, list): print (s)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X