J'écris un code qui parcourt l'adresse de Gettysburg et compte le nombre d'occurrences de chaque lettre. La lettre est ensuite stockée comme clé dans le dictionnaire et la valeur de chaque clé est le nombre total d'occurrences de cette valeur spécifique. L'adresse de Gettysburg a été divisée en trois lignes que nous pouvons parcourir. La façon dont je l'ai écrit est que chaque ligne est bouclée, mais je n'ai aucun moyen d'ajouter les occurrences de ligne pour obtenir le total dans le dictionnaire. Par exemple, si à la ligne 1 il y a 5 As, à la ligne 2 il y a 10 As et à la ligne 3 il y a 15 As, le total doit être 30 As et le dictionnaire doit être a: 30.
Aussi, dans le fichier on nous a donné des lignes vides entre les lignes 1 et 2 et entre les lignes 2 et 3, et je ne sais pas comment supprimer ces lignes pour les besoins de ma boucle.
Enfin, en ce moment, j'ai écrit toutes les lettres pour le programme, mais je me demandais s'il y avait un moyen plus simple de procéder qui pourrait simplifier ce que j'ai.
# Function: readFile
# Parameters: filename
# Return: dictionary
# Detail: Loop through each line of the Gettysburg Address File and count the occurrences of each letter in each line
# Detail: Sum the occurrences of each letter for each line to find the total occurences of each letter for the entire document
# Add the letter and its occurence to a dictionary key:value = letter:occurence
def readFile(filename = "gettysburg.txt"):
fileIn = open(filename, "r")
dictionary = {}
for line in fileIn:
line.lower()
letter = "a"
aCount = line.count("a")
dictionary[letter] = aCount
letter = "b"
bCount = line.count("b")
dictionary[letter] = bCount
letter = "c"
cCount = line.count("c")
dictionary[letter] = cCount
letter = "d"
dCount = line.count("d")
dictionary[letter] = dCount
letter = "e"
eCount = line.count("e")
dictionary[letter] = eCount
letter = "f"
fCount = line.count("f")
dictionary[letter] = fCount
letter = "g"
gCount = line.count("g")
dictionary[letter] = gCount
letter = "h"
hCount = line.count("h")
dictionary[letter] = hCount
letter = "i"
iCount = line.count("i")
dictionary[letter] = iCount
letter = "j"
jCount = line.count("j")
dictionary[letter] = jCount
letter = "k"
kCount = line.count("k")
dictionary[letter] = kCount
letter = "l"
lCount = line.count("l")
dictionary[letter] = lCount
letter = "m"
mCount = line.count("m")
dictionary[letter] = mCount
letter = "n"
nCount = line.count("n")
dictionary[letter] = nCount
letter = "o"
oCount = line.count("o")
dictionary[letter] = oCount
letter = "p"
pCount = line.count("p")
dictionary[letter] = pCount
letter = "q"
qCount = line.count("q")
dictionary[letter] = qCount
letter = "r"
rCount = line.count("r")
dictionary[letter] = rCount
letter= "s"
sCount = line.count("s")
dictionary[letter] = sCount
letter = "t"
tCount = line.count("t")
dictionary[letter] = tCount
letter = "u"
uCount = line.count("u")
dictionary[letter] = uCount
letter = "v"
vCount = line.count("v")
dictionary[letter] = vCount
letter = "w"
wCount = line.count("w")
dictionary[letter] = wCount
letter = "x"
xCount = line.count("x")
dictionary[letter] = xCount
letter = "y"
yCount = line.count("y")
dictionary[letter] = yCount
letter = "z"
zCount = line.count("z")
dictionary[letter] = bCount
print(dictionary)
fileIn.close()
# function: sortKeys
# parameter: Dictionary
# Return: a list of the keys in alphabetical order
# Use the sort method on a list
def sortKeys(dictionary):
sortedDictionary = sortKeys(dictionary)
dictionaryList = [[k,v] for k,v in dictionary.items()]
# function: main
# call the readFile function to create a dictionary and store in it a variable
# call the sortKeys function to get a list of sorted keys and store it in a variabel
# Loop through the sorted keys list to print each letter and its frequency (number of times it occurs) using the dictionary.
def main():
readFile()
sortKeys()
print("Displaying letter frequency of the Gettysburg Address")
for key, value in dictionaryList:
print(key, value)
main()
4 Réponses :
Certainement :
from string import ascii_lowercase
def readFile(filename = "gettysburg.txt"):
with open(filename) as f:
data = f.read().lower()
letter_counts = {letter: data.count(letter) for letter in ascii_lowercase}
return letter_counts
Premièrement, préférez utiliser avec pour ouvrir , car si vous utilisez open vous devez vous rappeler de fermer l'objet fichier.
Deuxièmement, ce que vous voulez, c'est essentiellement une compréhension de dictionnaire : un moyen de remplir automatiquement un dict avec à la fois des clés et des valeurs qui sont en quelque sorte liées.
Ce que fait cet extrait de code est de parcourir ascii_lowercase , qui est une chaîne contenant les lettres minuscules de l'alphabet. Chaque lettre devient une clé dans le dict résultant, avec la valeur correspondante le nombre de cette lettre dans le texte donné.
Vous pouvez utiliser Counter pour ce
import re
from collections import Counter
Counter(re.findall(r'[a-z]', open('gettysburg.txt').read()))
Cela fonctionne comme un dict, où key est l'occurrence et value est le montant de celle-ci. Consultez la documentation: https://docs.python.org/3.7/ library / collections.html # counter-objects
Utilisez string.ascii_lowercase
import string
...
for letter in string.ascii_lowercase:
dictionary[letter] = line.count(letter)
Merci pour l'aide! Lorsque j'ai fait ce correctif, il n'a mis à jour le dictionnaire qu'avec les occurrences de la première ligne. Est-ce que j'ai fait quelque chose de mal? Il y a 3 lignes qui doivent être bouclées.import string def readFile (filename = "gettysburg.txt"): fileIn = open (filename, "r") dictionary = {} pour la ligne dans fileIn: pour la lettre dans la chaîne.ascii_lowercase : dictionnaire [lettre] = ligne.count (lettre) print (dictionnaire) fileIn.close ()
@ Jaxon123 semble avoir manqué line.lower () initialement présenté dans votre code.
Les collections sont une façon d'accomplir cette tâche avec moins de code.
Réponse mise à jour
Voici une seule ligne qui accomplit la même tâche que ma réponse initiale.
/ p>
import string
from pprint import pprint
from collections import Counter
def get_characters_frequency(filename):
with open(filename, 'r') as input:
readfile = input.read()
filtered_text = [char.lower() for char in readfile if char in string.ascii_letters]
frequency_of_characters = Counter(filtered_text)
return frequency_of_characters
frequency_of_characters = get_characters_frequency('gettysburg_address.txt')
pprint (frequency_of_characters)
# outputs
Counter({'e': 167,
't': 126,
'a': 102,
'o': 93,
'h': 81,
'r': 80,
'n': 77,
'i': 68,
'd': 58,
's': 44,
'l': 42,
'c': 31,
'g': 28,
'w': 28,
'f': 27,
'v': 24,
'u': 21,
'p': 15,
'b': 14,
'm': 13,
'y': 10,
'k': 3,
'q': 1})
Réponse originale
Voici le code dans une fonction:
frequency_of_characters = Counter([char for char in open('gettysburg_address.txt').read().lower() if char in string.ascii_letters])
Découvrez
Counters