Est-il une meilleure façon de trouver si la chaîne contient des chiffres?
Je travaille avec des chaînes de caractères qui contiennent à la fois des chiffres et des caractères alphanumériques, ou tout simplement des chiffres, mais pas seulement alphas. Afin de tester les mauvais résultats, j'ai besoin de vérifier si les chaînes de caractères contenant au moins un chiffre, l'impression d'un message d'erreur s'il ne le fait pas. J'ai été en utilisant le code suivant:
s = '0798237 sh 523-123-asdjlh'
def contains_digits(s):
for char in list(s):
if char.isdigit():
return True
break
return False
if contains_digits(s) == True:
print s
else:
print 'Error'
Est-il plus pythonic ou de façon plus simple de le faire, ou cela suffit-il? Aussi, je ne peux pas juste vérifier pour voir si la chaîne est alphanumérique, parce que la chaîne peut contenir des symboles différents ('-', espaces, etc.)
Par la voie,
contains_digits == True
est redondante. Vous pouvez déposer le == True
partie et il va fonctionner de la même manière.OriginalL'auteur aensm | 2012-06-27
Vous devez vous connecter pour publier un commentaire.
C'est un de ces endroits où une expression régulière est juste la chose:
Petite démo:
Vous pouvez utiliser le
any
méthode avec.isdigit()
comme décrit dans @Wallacolloo réponse, mais c'est plus lent que la simple expression régulière:La
if
méthode est sur le pair avec l'expression régulière:Mais les choses s'aggraver si les chiffres apparaissent plus tard dans le texte:
Timings testé sur la version 2.6 de python sur Mac OS X 10.7.
return bool(_digits.search(d))
?Parce que je n'avais pas pensé à ça assez rapidement? 🙂
Le timeit résultats sur les miens sont à peu près la même chose... (d'environ .6 pour les deux)
Je reçois 0.84 s vs 0.96 s (2.7.3). Mais même le RE étaient plusieurs fois plus rapide, j'avais seulement l'utiliser si c'était un goulot d'étranglement. Je préfère de beaucoup écrit en Python.
ma conjecture est que le
isdigit()
test est inefficace; le plus de caractères, elle est appelée avant un chiffre est trouvé, le pire c'est.OriginalL'auteur Martijn Pieters
Utiliser le
any
fonction, en passant dans une séquence.Si tout élément de la séquence est vrai (c'est à dire est un chiffre, dans ce cas), puis
any
retourne True, sinon False. https://docs.python.org/library/functions.html#anySi vous êtes inquiet au sujet de la performance que votre méthode actuelle est effectivement plus rapide.
Merci, tu ne connaissais pas le "tout" de la fonction. Il semble donc que python chaînes sont itératif, et "pour l'omble de s" se fera par le biais de chaque caractère dans la chaîne?
En effet, python chaînes sont séquences trop.
Pierre: Merci pour l'affichage de la référence. Je n'aurais jamais pu s'attendre à une expression régulière pour surpasser même unoptimized code comme celui-ci. Je ne pensais pas en termes de performance - si je l'étais, j'aurais évité
any
et écrit quelque chose comme ce que je suis sur le point de monter dans mon post, ce qui surpasse l'expression régulière de la solution (en 32 bits, la version 2.6 de Python sur Win7) d'environ 1.062 vs 1.254.J'aurais attendu
any
pour être aussi rapide que ça, en fait.OriginalL'auteur Ponkadoodle
Pour ceux qui recherchent la plus courte de la solution:
any(d in s for d in'0123456789')
OriginalL'auteur Nickmaovich
Après la lecture de la discussion ci-dessus, j'ai été curieux de connaître les performances d'un jeu basé sur la version comme ceci:
Dans mes tests, cela a été un peu plus rapide en moyenne que les
re
version sur un ordinateur et un peu plus lent sur l'autre (?). Juste pour le fun, j'ai comparé par certains à d'autres versions.Échantillon fonctionne pour les deux ordinateurs (de temps pour chaque cas, et le ~moyenne):
OriginalL'auteur