J'ai deux listes qui ressemblent à:
list1 = str(list1) list2 = str(list2) outcome = [x for x in list2 if [y for y in list1 if x in y]]
Je veux filtrer la sous-chaîne list1
par des éléments de list2
et obtenir la sortie attendue comme suit:
outcome = ['bj-100-cy', 'sh-200-pd']
En faisant:
list1 = ['bj-100-cy','bj-101-hd','sh-200-pd','sh-201-hp'] list2 = [100, 200]
J'obtiens un résultat comme celui-ci: ['[', "1", "0", "0", ",", "", "2", "0", "0", "]"]
.
Comment puis-je le filtrer correctement? Merci.
Référence liée:
Est-il possible de filtrer une liste de sous-chaînes par une autre liste de chaînes en Python?
7 Réponses :
Compréhension de liste et any
:
In [92]: list1 = ['bj-100-cy','bj-101-hd','sh-200-pd','sh-201-hp'] ...: list2 = [100, 200] ...: In [93]: [i for i in list1 if any(i for j in list2 if str(j) in i)] Out[93]: ['bj-100-cy', 'sh-200-pd']
any
pour vérifier si un élément de list2
est un sous-chaîne de l'élément list1
( __contains__
) en cours d'itération.
Exemple:
[i for i in list1 if any(i for j in list2 if str(j) in i)]
Merci, j'essaie avec votre script pour mes données réelles (qui sont quasi identiques aux données d'exemple ici), je dois ajouter list2 = [str (x) for x in list2]
sinon j'ai TypeError: 'in
@ahbon C'est étrange, car j'ai tapé la conversion dans str (j)
: any (i for j in list2 if str (j) in i)
Ouais, j'ai relu les données et essayé à nouveau, ça va maintenant, merci pour toute aide pour cette affiche.
Vous pouvez utiliser any
:
list1 = ['bj-100-cy','bj-101-hd','sh-200-pd','sh-201-hp'] list2 = [100, 200] list2 = [str(x) for x in list2] outcome = [s for s in list1 if any(x in s for x in list2)]
any
renvoie True
si l'une des conditions que vous donnez ce sont Vrai
.
list1 = ['bj-100-cy','bj-101-hd','sh-200-pd','sh-201-hp'] list2 = [100, 200] outcome = [x for x in list1 for y in list2 if str(y) in x]
Vous pouvez essayer celui-ci:
['bj-100-cy', 'sh-200-pd']
résultat:
list1 = ['bj-100-cy','bj-101-hd','sh-200-pd','sh-201-hp'] list2 = [100, 200] outcome = [] for item in list1: if any(str(i) in item for i in list2): outcome.append(item)
Une autre compréhension de liste alternative:
>>> list1 = ['bj-100-cy','bj-101-hd','sh-200-pd','sh-201-hp'] >>> list2 = [100, 200] >>> occur = [i for i in list1 for j in list2 if str(j) in i] >>> occur ['bj-100-cy', 'sh-200-pd']
Vous pouvez utiliser la méthode intégrée filter pour filtrer la liste en fonction à votre condition. Votre condition nécessite l'opérateur python dans
pour rechercher l'aiguille ([100, 200])
dans la botte de foin ([['bj-100-cy', 'bj- 101-hd ', ...]])
.
Nous pouvons utiliser la méthode contient
pour simplifier la syntaxe de recherche.
Code
>>> list1 = ['bj-100-cy','bj-101-hd','sh-200-pd','sh-201-hp'] >>> list2 = [100, 200] >>> for item in filter(lambda x: any(contains(x,str(y)) for y in list2), list1): ... print(item) ... bj-100-cy sh-200-pd
Exemple
from operator import contains filter(lambda x: any(contains(x,str(y)) for y in list2), list1)
Vous pouvez utiliser l'expression régulière:
import re list1 = ['bj-100-cy', 'bj-101-hd', 'sh-200-pd', 'sh-201-hp'] list2 = [100, 200] pattern = re.compile('|'.join(map(str, list2))) list(filter(pattern.search, list1)) # ['bj-100-cy', 'sh-200-pd']