web-dev-qa-db-fra.com

Python - Créer des dictionnaires en lisant des fichiers texte et cherchant dans ce dictionnaire

Je dois créer un programme qui prend la saisie d'un utilisateur d'un État et renvoie cette fleur d'état. Le fichier texte suivant que je dois lire s’appelle "state_flowers.txt" et contient les données suivantes

California,Poppy
West Virginia,Rhododendron
South Dakota,Pasque Flower
Connecticut,Mountain Laurel
New York,Rose
Georgia,Cherokee Rose
Washington,Coast Rhododendron
Virgina,American Dogwood
Arizona,Saguaro Cactus
Hawaii,Pua Aloalo
Alabama,Camelia
Illinois,Violet
Indiana,Peony
Delaware,Peach Blossom
Iowa,Wild Prairie Rose
Kansas,Sunflower
Alaska,Forget Me Not
Lousiana,Magnolia
Maine,White Pine Tassel
Massachusetts,Trailing Arbutus
Michigan,Apple Blossom
Minnesota,Lady Slipper
Mississippi,Magnolia
Missouri,Hawthorn
Montana,Bitterroot
Nebraska,Goldenrod
Nevada,Sagebrush
New Hampshire,Lilac
New Jersy,Violet
New Mexico,Yucca Flower
etc......

Le problème que je rencontre avec mon code est qu'il ne demandera que l'entrée du nom de l'État et continuera à le faire encore et encore, sans résultat. Voici ce que j'ai pour le code jusqu'à présent:

d = {}
myFile = open('state_flowers.txt', 'r')
for line in myFile:
    line2=line.split(",")
    state = line2[0]
    flower = line2[1]
    c = len(flower)-1 
    #Strips the new line symbol
    flower = flower[0:c]
    d[state] = flower 
    #matches each state with its flower

for state, flower in d.items():   
    search = input("Enter state name:")    #user enters input of state
    if state == search:                   
        print(flower, "is the State Flower for", state)

Comme je l'ai dit, tout ce que mon programme demande, c'est l'entrée, encore et encore. Donc, il fait comme tel:

Enter state name:Maine
Enter state name:Califorina
Enter state name:Texas
Enter state name:
Enter state name:

Je sens que je suis très proche de cela, toute aide est appréciée et une explication claire de ce que je fais de manière incorrecte serait très appréciée! Je vous remercie!

7
H. Raydon

Tu es proche. Il n'est pas nécessaire d'itérer votre dictionnaire. La beauté de dict est qu’elle offre O(1) accès aux valeurs avec une clé. Vous pouvez simplement prendre votre saisie et insérer la clé dans votre dictionnaire:

search = input("Enter state name:")    #user enters input of state
print(d.get(search), "is the State Flower for", search)

Avec Python 3.6+, vous pouvez écrire cela plus clairement en utilisant les f-strings:

print(f'{d.get(search)} is the State Flower for {search}')

Si l'état n'existe pas dans votre dictionnaire, d.get(search) renverra None. Si vous ne souhaitez rien imprimer dans cette situation, vous pouvez utiliser une instruction if:

search = input("Enter state name:")    #user enters input of state
if search in d:
    print(f'{d[search]} is the State Flower for {search}')
7
jpp

Votre problème est que dans votre code:

for state, flower in d.items():   
    search = input("Enter state name:")    #user enters input of state
    if state == search:                   
        print(flower, "is the State Flower for", state)

vous parcourez toutes les paires État/Fleur et demandez à chaque fois un nom d’État. Donc, si vous avez cinquante paires d’états/fleurs, l’utilisateur sera interrogé cinquante fois. Ce n'est pas ce que tu veux.

Au lieu de cela, déplacez la ligne qui contient l'instruction input(...) vers en dehors de (c'est-à-dire avant) la boucle. De quelle manière, la boucle ne commencera pas avant après c'est demandé.

En ce qui concerne la ligne d'entrée et la boucle:

search = input("Enter state name:")    #user enters input of state
for state, flower in d.items():   
    if state == search:                   
        print(flower, "is the State Flower for", state)

envisagez de le remplacer par trois lignes non bouclées:

state = input("Enter state name: ")
flower = d[state]
print(flower, "is the State Flower for", state)

Et c'est tout. Il n’ya rien à rechercher manuellement dans une boucle, puisqu’un objet dict cherchera pour vous.

Si vous craignez que l'utilisateur ne saisisse pas correctement un nom d'état et que vous ne souhaitiez pas que votre programme lève une exception, vous pouvez modifier la ligne flower = d[state] en:

flower = d.get(state, 'Nothing')

d.get(state) fonctionne à peu près de la même manière que d[state], sauf que vous pouvez spécifier le paramètre auquel définir flower (dans ce cas, "Nothing") si la state ne figure pas dans le dict.

1
J-L

Vous pouvez simplement faire cela avec Python 3.6+:

print(f'{d.get(search)} is the State Flower for {search}')
0
user10873885