1
votes

Puis-je simplifier mon code pour ne pas écrire chaque lettre de l'alphabet individuellement?

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()


1 commentaires

Découvrez Counter s


4 Réponses :


3
votes

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é.


0 commentaires

0
votes

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


0 commentaires

1
votes

Utilisez string.ascii_lowercase

import string
...

for letter in string.ascii_lowercase:
    dictionary[letter] = line.count(letter)


2 commentaires

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.



0
votes

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])


0 commentaires