2
votes

Éléments de liste de filtre de sous-chaîne par une autre liste en Python

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?


0 commentaires

7 Réponses :


4
votes

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)]


3 commentaires

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 ' nécessite une chaîne comme opérande de gauche, pas un int


@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.



3
votes

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.


0 commentaires

1
votes
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]

0 commentaires

1
votes

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)


0 commentaires

1
votes

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']


0 commentaires

1
votes

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)


0 commentaires

1
votes

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']


0 commentaires