2010-06-02 8 views
0

J'ai parcouru les didacticiels Python dans ce resource. Tout est assez clair dans le code ci-dessous qui compte le nombre de caractères. Seule la section que je ne comprends pas est la section où le nombre affecté à une liste et multiplié par 120. Quelqu'un peut-il expliquer quel est le but de cette en anglais s'il vous plaît plaine.Nombre de caractères Python

def display(i): 
    if i == 10: return 'LF' 
    if i == 13: return 'CR' 
    if i == 32: return 'SPACE' 
    return chr(i) 

infile = open('alice_in_wonderland.txt', 'r') 
text = infile.read() 
infile.close() 

counts = 128 * [0] 

for letter in text: 
    counts[ord(letter)] += 1 

outfile = open('alice_counts.dat', 'w') 
outfile.write("%-12s%s\n" % ("Character", "Count")) 
outfile.write("=================\n") 

for i in range(len(counts)): 
    if counts[i]: 
     outfile.write("%-12s%d\n" % (display(i), counts[i])) 

outfile.close() 
+0

Rien à voir avec votre question: Remarque: Ce code suppose que le fichier alice_in_wonderland.txt ne contient que des caractères ASCII. Cela peut être bon pour un exemple, mais c'est une hypothèse dangereuse pour les fichiers de mots réels. – Oddthinking

+1

Votre code semble fonctionner correctement avec Python 1.5. Peut-être que vous devriez chercher un tutoriel plus à jour - celui qui mentionne 'defaultdict' serait une bonne idée :-) –

+0

@ user74283, rappelez-vous que vous pouvez toujours obtenir des réponses très rapides à ces questions et des questions similaires en insérant 'imprimer compte 'dans votre code. – joaquin

Répondre

6

128 * [0] crée une liste de 128 éléments, chacun d'une valeur de 0.

>>> 3 * [0] 
[0, 0, 0] 

Ensuite, étant donné que les caractères ASCII valides sont dans la plage 0-127, chaque lettre accède à un index compte (ord(letter) renvoie la valeur numérique d'un caractère) et incrémente la valeur de cet index.

Par exemple, le caractère '0' correspond à une valeur numérique de 48. Alors, quand un '0' se rencontre, counts[48] est incrémentée par 1.

1

La ligne counts = 128 * [0] Remplit une liste de 128 éléments avec des zéros.

Cette liste est ensuite utiliser pour incrémenter nombre de caractères en fonction de la valeur ascii de chaque caractère, étant donné que les valeurs ascii vont de 0 à 127.

3

Comme les autres réponses expliquent, il crée une 128 liste des 0. Ce qu'ils n'expliquent pas, c'est que c'est le même0, 128 fois. Depuis int est immuable ce masque un problème que beaucoup de programmeurs Python novices courent dans:

>>> l = [[]] * 5 
>>> l 
[[], [], [], [], []] 
>>> l[0].append(1) 
>>> l 
[[1], [1], [1], [1], [1]] 
+0

Oui, c'est dangereux mais seulement pour les types de données complexes. C'est correct dans l'exemple de Mark car il n'y a que des ints dans la liste. – lmichelbacher

+0

Bien sûr, si tout ce que l'on fait est d'assigner * des objets aux index de la liste, la mutabilité (im) du contenu de la liste est totalement hors de propos: 'l = 4 * [[]]; imprimer l; l [0] = "salut"; imprimer l'. – tzot

Questions connexes