40 votes

Comment itérer dans une chaîne de caractères en Python ?

À titre d'exemple, disons que je souhaite répertorier la fréquence de chaque lettre de l'alphabet dans une chaîne de caractères. Quel serait le moyen le plus simple de le faire ?

Voici un exemple de ce à quoi je pense... la question est de savoir comment rendre allTheLetters égal auxdites lettres sans quelque chose comme allTheLetters = "abcdefg...xyz". Dans beaucoup d'autres langages, je pourrais simplement faire letter++ et incrémenter mon chemin à travers l'alphabet, mais jusqu'à présent je n'ai pas trouvé de moyen de le faire en python.

def alphCount(text):
  lowerText = text.lower()
  for letter in allTheLetters:  
    print letter + ":", lowertext.count(letter)

72voto

Glyph Points 17756

La question que vous avez posée (comment itérer dans l'alphabet) n'est pas la même que le problème que vous essayez de résoudre (comment compter la fréquence des lettres dans une chaîne).

Vous pouvez utiliser string.lowercase, comme d'autres affiches l'ont suggéré :

import string
allTheLetters = string.lowercase

Pour faire les choses comme vous en avez l'habitude, en traitant les lettres comme des chiffres, vous pouvez utiliser les fonctions "ord" et "chr". Il n'y a absolument aucune raison de faire exactement cela, mais cela se rapproche peut-être de ce que vous essayez de comprendre :

def getAllTheLetters(begin='a', end='z'):
    beginNum = ord(begin)
    endNum = ord(end)
    for number in xrange(beginNum, endNum+1):
        yield chr(number)

Vous pouvez dire qu'il fait la bonne chose parce que ce code imprime True :

import string
print ''.join(getAllTheLetters()) == string.lowercase

Mais, pour résoudre le problème que vous essayez réellement de résoudre, vous devez utiliser un dictionnaire et rassembler les lettres au fur et à mesure :

from collections import defaultdict    
def letterOccurrances(string):
    frequencies = defaultdict(lambda: 0)
    for character in string:
        frequencies[character.lower()] += 1
    return frequencies

Utilisez comme ça :

occs = letterOccurrances("Hello, world!")
print occs['l']
print occs['h']

Ceci imprimera '3' et '1' respectivement.

Notez que cela fonctionne également pour l'unicode :

# -*- coding: utf-8 -*-
occs = letterOccurrances(u"hélló, wórld!")
print occs[u'l']
print occs[u'l']

Si vous essayiez l'autre approche sur l'unicode (incrémenter chaque caractère), vous attendriez longtemps ; il y a des millions de caractères unicode.

Pour implémenter votre fonction originale (imprimer les comptes de chaque lettre dans l'ordre alphabétique) en termes de ceci :

def alphCount(text):
    for character, count in sorted(letterOccurrances(text).iteritems()):
        print "%s: %s" % (character, count)

alphCount("hello, world!")

3 votes

Vous devriez vraiment utiliser string.ascii_lowercase au lieu d'écrire votre propre getAllTheLetters. de plus, c'est un nom horriblement impythique pour une fonction !

0 votes

Votre fonction letterOccurrances() comptera également les espaces blancs et la ponctuation, peut-être pas intentionnellement.

0 votes

Actuellement, le nombre de caractères Unicode est toujours inférieur à un million. En outre, certains d'entre eux ne sont pas alphabétiques, et il faut donc les exclure lors de l'impression des fréquences.

14voto

Matthew Trevor Points 5277

la question est de savoir comment rendre allTheLetters égal auxdites lettres sans quelque chose comme toutesLettres = "abcdefg...xyz"

C'est en fait fourni par le module string, ce n'est pas comme si vous deviez le taper manuellement vous-même ;)

import string

allTheLetters = string.ascii_lowercase

def alphCount(text):
  lowerText = text.lower()
  for letter in allTheLetters:  
    print letter + ":", lowertext.count(letter)

0 votes

Cette solution est lente, car elle comporte des itérations imbriquées (lowertext.count() itère sur la chaîne de caractères afin de trouver le nombre).

4 votes

Cependant, il a été répondu à la question spécifique. Les autres problèmes sont ceux des affiches originales.

0 votes

Ou vous pouvez obtenir toutes les lettres minuscules en faisant une itération sur la liste suivante : allTheLetters=[chr(i+97) for i in range(26)]

9voto

Adam Pierce Points 12801

Si vous voulez juste faire un comptage de fréquence d'une chaîne, essayez ceci :

s = 'hi there'
f = {}

for c in s:
        f[c] = f.get(c, 0) + 1

print f

0 votes

C'est une solution très rapide car elle n'itère qu'une seule fois sur la chaîne donnée, et est donc O(n) contrairement à l'utilisation d'itérations imbriquées. L'événement est meilleur si vous utilisez f = defaultdict(int) et simplement f[c]+=1

0 votes

Est-ce que le membre d'obtention est O(1) ? Si c'est O(n), alors l'ensemble est O(n^2).

0 votes

@Pax Diablo : Les mappings sont hachés. La récupération des dictionnaires est O(1).

4voto

Kimvais Points 12453

Pour le comptage des objets, le évident est la solution Compteur

from collections import Counter
import string

c = Counter()
for letter in text.lower():
    c[letter] += 1

for letter in string.lowercase:
    print("%s: %d" % (letter, c[letter]))

4 votes

Encore plus simple, vous pouvez remplacer la boucle d'affectation par : c = Counter(text.lower())

3voto

Jacob Krall Points 10327

Quelque chose comme ça ?

for letter in range(ord('a'), ord('z') + 1):
  print chr(letter) + ":", lowertext.count(chr(letter))

0 votes

Je pense que votre "lettre" dans le count() devrait être "chr(lettre)".

0 votes

Puisque vous avez corrigé le problème (et que je n'ai pas eu de problème de décalage entre les deux réponses, ce qui fait que je n'ai vérifié que jusqu'à 'y' :-), j'ai supprimé ma réponse et augmenté la vôtre.

0 votes

@Adam : J'ai temporairement voté contre cette réponse pour l'enlever de la première position et élever la réponse de Matthew. Ce n'est pas non plus un code très pythonique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X