• # On dirait du C

    Posté par . En réponse au journal Analyse de texte. Évalué à 10.

    for i in range (0,len(c)):
     buf.popleft()
     buf.append(c[i])

    ça s'écrit plutôt comme ça:

    for d in c:
     buf.popleft()
     buf.append(d)

    vu qu'on est en python, pas besoin de reprendre un idiome du C. De manière générale, dès que tu as "range(len(x))", tu sais que tu as quelque chose de moche en python (si tu as vraiment besoin de l'indice, tu peux toujours utiliser enumerate). Et par habitude, "c" c'est plutôt un caractère, du coup le mettre pour représenter une chaîne, ça choque l'œil.

    s = string.replace ("\n"," ")
    string = s.replace(" "," ")

    ça s'écrit:

    string = string.replace ("\n"," ").replace(" "," ")

    Pas besoin de tampon.

    while True:
     counter += 1

    il y a directement une fonction pour ça:

    from itertools import count
    for counter in count(start=0):

    Pour ce qui est de compter, tu as collections.Counter qui te permet d'éviter de vérifier si une clé est déjà dans ton dictionnaire (et d'incrémenter si c'est le cas où de mettre à 1 sinon): avec Counter, tu fais simplement compteur[clé] += 1 et ça marche toujours: si la clé n'est pas présente, elle est considérée valoir 0.

    Et enfin, parce que vraiment, on dirait du C ce code, tout le foin avec le buffer etc, ça me parait entièrement inutile. Tu peux parfaitement lire ligne par ligne l'entrée standard:

    import fileinput
    for line in fileinput.input():

    De manière générale, si tu crois que tu as besoin de gérer la mémoire toi-même en Python pour une tâche aussi simple, c'est que tu n'utilises pas les bons outils.