1
votes

Comment compter la longueur de la liste avec l'exclusion conditionnelle de certaines chaînes et nombres? Python

J'ai une liste que j'aimerais compter, mais elle doit d'abord être nettoyée.

La liste ressemble à quelque chose comme:

list= ['Skills & Endorsements', 'Problem Solving',  'See 9 endorsements for Problem Solving', '9']  

Je veux compter la ligne, mais exclure tous les nombres et les chaînes contenant des nombres. Dans cet exemple, je voudrais supprimer le numéro 9 et l'élément Voir 9 recommandations pour la résolution de problèmes .

J'ai du mal à venir avec un conditionnel en Python, où 0 est s'il enfreint le conditionnel, et 1 s'il remplit les conditions compte si ! = un nombre ou une chaîne qui inclut See .


1 commentaires

Essayez d'utiliser une expression régulière pour vérifier si elle contient un nombre ou non.


5 Réponses :


1
votes

Définissez une méthode avec votre condition, puis itérez les éléments de la liste sur la fonction

In [26]: def my_cond(x):
    ...:     return  any(map(str.isdigit, x))
    ...:
    ...:

In [27]: print(sum(1 for x in list2 if not my_cond(x)))
2

La fonction vérifierait si un caractère de la chaîne est un chiffre ou non en fonction de ce qu'elle renverrait vrai ou faux.


0 commentaires

2
votes

Essayez ceci:

['Skills & Endorsements', 'Problem Solving']

Ceci filtre les éléments sans numéro.

[i for i in list1 if not any(j.isnumeric() for j in i)]


6 commentaires

Cela fonctionne maintenant. Je ne pense pas que vous ayez vraiment besoin de split () .


@MarkMeyer alors?


'Voir 9 recommandations pour la résolution de problèmes' n'est pas numérique


Oui, mais any (j.isnumeric () pour j dans 'Voir 9 recommandations pour la résolution de problèmes') est True . Vous n'avez pas besoin de le diviser. L'itérateur regarde chaque caractère.


@MarkMeyer maintenant est-ce que ça va?


Ouais, c'est un +1 pour moi.



3
votes

Une façon de faire est d'utiliser le module re pour créer une simple expression régulière qui correspond aux nombres. Ensuite, vous pouvez mettre ceci dans une liste de compréhension et demander sa longueur:

import re

l = ['Skills & Endorsements', 'Problem Solving',  'See 9 endorsements for Problem Solving', '9']  

# what the comprehension makes:
print([s for s in l if re.search(r'\d', s) is None])
# ['Skills & Endorsements', 'Problem Solving']

len([s for s in l if re.search(r'\d', s) is None])
# 2


3 commentaires

Vous avez été critiqué à cause de moi (je pense). vérifier le commentaire de ma réponse


@JoshuaVarghese J'ai en fait rejeté votre réponse et je faisais un commentaire lorsque vous l'avez supprimée. Cela ne fonctionnait pas du tout à cause des espaces dans les chaînes.


Je suppose que si l'un des éléments de la liste était en fait un nombre ( 9 ), plutôt qu'une représentation sous forme de chaîne ( '9' ), ceci briserait. C'est peut-être pour cela qu'il a été rejeté. utiliser re.search (r '\ d', str (s)) résoudrait cela.



2
votes

Je vous suggère d'utiliser re pour vérifier s'il y a un nombre dans la chaîne ou pas

import re
list= ['Skills & Endorsements', 'Problem Solving',  'See 9 endorsements for Problem Solving', '9']
count = len([e for e in list if not re.findall('\d', e)])

L'expression régulière dans cet exemple essayant de trouver tous les nombres \ d peut apparaître dans chaque élément. S'il n'y a pas de nombre, il "comptera" cet élément et l'ajoutera à une liste temporaire. Enfin, nous avons juste besoin d'obtenir le len de cette liste temporaire pour savoir combien d'éléments elle contient


2 commentaires

Quelle est la différence entre l'utilisation de re.findall et re.search comme solution?


Consultez-le ici pour plus d'informations: tutorialspoint.com/...



2
votes

Vous pouvez utiliser ce code:

['Skills & Endorsements', 'Problem Solving']

Sortie:

mylist = ['Skills & Endorsements', 'Problem Solving',  'See 9 endorsements for Problem Solving', '9']

print([s for s in mylist if not any(c.isdigit() for c in s)])


0 commentaires