Python - Создание словарей путем чтения текстовых файлов и поиска в этом словаре - PullRequest
0 голосов
/ 03 декабря 2018

Я должен создать программу, которая принимает пользовательский ввод состояния и возвращает цветок этого состояния.Следующий текстовый файл, который я должен прочитать, называется «state_flowers.txt» и содержит следующие данные

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

Проблема, с которой я сталкиваюсь в своем коде, заключается в том, что он запрашивает только вводимя штата и продолжайте делать это снова и снова без вывода.Вот что у меня есть для кода:

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)

Как я уже говорил, все, что моя программа запрашивает, это ввод снова и снова.Так оно и есть:

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

Мне кажется, что я очень близок к этому, любая помощь приветствуется, и было бы очень полезно получить четкое объяснение того, что я делаю неправильно!Спасибо!

Ответы [ 4 ]

0 голосов
/ 06 января 2019

Вы можете просто сделать это с Python 3.6 +:

print(f'{d.get(search)} is the State Flower for {search}')
0 голосов
/ 03 декабря 2018

Вы можете попробовать простую отладку.Выведите значения «состояние» и «поиск» непосредственно перед условием сравнения.Это условие не получает "True", следовательно, оно просто повторяется для пользовательского ввода:

for state, flower in d.items():   
    search = input("Enter state name:")    #user enters input of state
    if state == search: 
        print(state,search)                  
        print(flower, "is the State Flower for", state)
0 голосов
/ 04 декабря 2018

Ваша проблема в том, что в вашем коде:

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)

вы перебираете все пары состояния / цветка и каждый раз запрашиваете имя штата.Так что, если у вас есть пятьдесят пар состояний / цветов, пользователю будет предложено пятьдесят раз.Это не то, что вам нужно.

Вместо этого переместите строку, содержащую инструкцию input(...), в за пределами (то есть до) цикла.Каким образом цикл не начнется до тех пор, пока после не будет запрошено.

Что касается строки ввода и цикла:

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)

рассмотрите возможность замены на тринецикловые строки:

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

И все.Там нет ничего, чтобы искать вручную в цикле, так как объект dict будет искать вас.

Если вы обеспокоены тем, что пользователь неправильно вводит имя состояния, и вы не хотите, чтобы ваша программа бросалаИсключение: вы можете изменить строку flower = d[state] на:

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

d.get(state) работает почти так же, как d[state], за исключением того, что вы можете указать, на что установить flower (в этомрегистр "Nothing"), если state не найден в диктовке.

0 голосов
/ 03 декабря 2018

Вы рядом.Там нет необходимости перебирать ваш словарь.Прелесть dict в том, что она предлагает O (1) доступ к значениям , заданным ключом.Вы можете просто взять свой ввод и передать ключ в свой словарь:

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

С Python 3.6+ вы можете написать это более четко, используя f-строки:

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

Еслисостояние не существует в вашем словаре d.get(search) вернет None.Если вы не хотите ничего печатать в этой ситуации, вы можете использовать оператор 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}')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...