2016-11-18 2 views
-1

Я работал над простым конвертером и сохранял все коэффициенты преобразования в каталогах. Он принимает то, что для преобразования и проверяет, чтобы убедиться, что это конвертируемая, и занимает, сколько необходимо преобразовать, а затем ошибки с этой ошибкой:Ошибка в Math Directory

Traceback (most recent call last): 
    File "python", line 20, in <module> 
TypeError: string indices must be integers 

код (живой, это просто так, когда закончили она не будет повторяться вечно):

alive = 'yes' 
while(alive == 'yes'): 
     doable = {'pint': ['cup', 'quart', 'galleon', 'pint'], 'quart': ['cup', 'quart', 'pint', 'galleon'], 'galleon': ['cup', 'quart', 'pint', 'galleon'], 'cup': ['cup', 'quart', 'galleon', 'pint', 'tbsp', 'tsp'], 'ounce': ['cup', 'tbsp', 'tsp', 'ounce', 'ml', 'liter', 'pound', 'gram', 'kilogram'], 'tbsp': ['cup', 'tbsp', 'tsp', 'ounce'], 'tsp': ['tsp', 'tbsp', 'cup', 'ounce'], 'ml': ['ml', 'ounce', 'liter'], 'liter': ['ml', 'ounce', 'liter'], 'pound': ['ounce', 'gram', 'kilogram', 'pound'], 'gram': ['ounce', 'gram', 'kilogram', 'pound'], 'kilogram': ['ounce', 'gram', 'kilogram', 'pound']} 
     pint = {'cup': 2, 'quart': 0.5, 'galleon': 0.125, 'pint': 1} 
     quart = {'cup': 4, 'quart': 1, 'galleon': 0.25, 'pint': 2} 
     galleon = {'cup': 16, 'quart': 4, 'galleon': 1, 'pint': 8} 
     cup = {'cup': 1, 'quart': 0.25, 'galleon': 0.0625, 'pint': 0.5, 'tbsp': 16, 'tsp': 48, 'ounce': 8} 
     ounce = {'cup': 0.125, 'tbsp': 2, 'tsp': 6, 'ounce': 1, 'ml': 30, 'liter': 0.0295735, 'pound': 0.0625, 'gram': 28.3495, 'kilogram': 0.0283495} 
     tbsp = {'cup': 0.0616115, 'tbsp': 1, 'tsp': 3, 'ounce': 0.5} 
     tsp = {'cup': 0.020833333, 'tbsp': 0.33333, 'tsp': 1, 'ounce': 0.166667} 
     ml = {'ml': 1, 'ounce': 0.033814, 'liter': 0.001} 
     liter = {'ml': 1000, 'ounce':33.8, 'liter': 1} 
     pound = {'ounce': 16, 'gram': 453.592, 'kilogram': 0.453592, 'pound': 1} 
     gram = {'ounce': 0.035274, 'gram': 1, 'kilogram': 0.001, 'pound': 0.00220462} 
     kilogram = {'ounce': 35.274, 'gram': 1000, 'kilogram': 1, 'pound': 2.2} 
     first = input("What would you like to convert from? ") 
     second = input("What would you like to convert to? ") 
     if(second in doable[first]): 
      amount = input("What is the amount of the first measurement? ") 
      conversion = first[second] 
      answer = float(amount) * float(conversion) 
      print("Your answer is: " + str(answer) + " " + second + "(s).") 
     else: 
      print("\nYOU CAN NOT CONVERT BETWEEN THESE TWO VARIABLES.") 
alive = 'no' 

Любые идеи, почему это может быть erroring и как она может быть фиксированной или другой метод, чтобы избежать ошибки? Благодарю.

+2

Рассмотрите возможность чтения сообщения об ошибке и подумайте о том, что тип 'first' находится в строке 2 0. – Cairnarvon

ответ

0

первые и второй - это названия единиц - это строки. Что вы просили в этой строке что-то вроде

"ounce"["gram"] 

которого нонсенс системы времени выполнения. Номер элемента «грамм» строки «унция» отсутствует.

Полагаю, что вы пытаетесь разрешить пользователю вводить имя переменной каталога. Это серьезная путаница функциональности в Python. Строка значение «унция» не относится к переменнаяунция.

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


Возможное решение:

Сделайте таблицу преобразования каталог каталогов.Каждый из ваших нынешних каталогов становится основным заголовком в этой таблице:

conversion = { 
    "pint": {'cup': 2, 'quart': 0.5, 'galleon': 0.125, 'pint': 1}, 
    "quart": {'cup': 4, 'quart': 1, 'galleon': 0.25, 'pint': 2}, 
    ... 
    "kilogram": {'ounce': 35.274, 'gram': 1000, 'kilogram': 1, 'pound': 2.2} 

Теперь вы можете ссылаться на коэффициент преобразования, как

conversion[first][second] 

Орфография подробно:

"galleon" is a ship powered by oars. 
"Gallon" is a unit of measurement. 
+0

Спасибо вам за помощь! И спасибо за орфографический отзыв! – Adam

+0

Пожалуйста, не забудьте проголосовать за все, что захотите, и особенно «принять» ваш любимый ответ. Это позволяет Stack Overflow правильно архивировать вопрос. – Prune

1

Линия conversion = first[second] не работает так, как вы ее предполагаете. first - это строка. Это не переменная, названная этой строкой. Чтобы получить переменную, вам нужно будет сделать eval(first), а eval, как правило, плохая идея.

Когда вы сталкиваетесь с именами переменных в качестве данных, это обычно означает, что вы неправильно организовываете вещи. Вместо того, чтобы пытаться получить переменную по ее имени, сделайте имя ключом в словаре.

В этом случае у вас уже есть соответствующий словарь, doable. Вместо того, чтобы иметь значения словаря быть списки строк (которые являются имена других переменных), положить другие словари в doable:

doable = { # you might want to change this variable's name 
    'pint': {'cup': 2, 'quart': 0.5, 'galleon': 0.125, 'pint': 1}, 
    'quart': {'cup': 4, 'quart': 1, 'galleon': 0.25, 'pint': 2}, 
    #... 
    } 

Проблемный код теперь станет:

if second in doable[first]: # this works exactly the same as before 
    conversion = doable[first][second] # this gets an extra level of indexing 
    #... 
+0

Спасибо! Он работает сейчас и, безусловно, является улучшением! – Adam

Смежные вопросы