web-dev-qa-db-fra.com

Rechercher une sous-chaîne dans une liste dans Python

Contexte:

Exemple de liste: mylist = ['abc123', 'def456', 'ghi789']

Je veux récupérer un élément s'il existe une correspondance pour une sous-chaîne, comme abc

Code:

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

ci-dessus imprime 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. Donc, si je vérifie 'abc' je veux seulement imprimer 'abc123' de la liste.

82
frankV
print [s for s in list if sub in s]

Si vous voulez les séparer par des nouvelles lignes:

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())
122
David Robinson

Toutes les réponses fonctionnent mais elles parcourent toujours toute la liste. Si je comprends votre question, vous n'avez besoin que du premier match. Donc, vous n'avez pas à prendre en compte 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 est à la fin de la liste ou pour de très petites listes, cela ne fait aucune différence, mais considérons 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
46
Frank Zalkow

Utilisez une simple boucle for:

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

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

les rendements

abc123
18
unutbu

Ceci affiche tous les éléments contenant des sous:

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

Je voudrais juste utiliser une regex simple, 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
8
oathead