Ari Madian Ari Madian - 9 months ago 19
Python Question

When I try to multiply an integer by a dictionary value (also an integer), it gives an answer that makes no sense

When I run the program and put in the values 3, 1, 1 so convert one cup to tablespoons, it uses the TOtbsp function at the bottom. For troubleshooting purposes, I've made it print out four variables before the final result. These variables all print out the correct results,

def TOtbsp ():
os.system('cls')
print ('Convert ' + convFROMconv + ' to: tablespoons')
dictEnt = dCallOne['tbsp']
print (dCallOne['tbsp'])
print (dCallOne)
print (dictEnt)
print (convFactor)
calc = convFactor * dictEnt
print(calc)


^That's the TOtbsp function, what comes out is this:

Convert Cups to: tablespoons

16
{'tbsp': 16, 'tsp': 48, 'quart': 0.25, 'floz': 8.32674, 'pint':0.5,'gal':0.0625, 'ml': 236.588, 'liter': 0.236588}
16
1
1111111111111111


These are all correct, except the final one,
calc
. I've tried setting it up a few different ways:

calc = convFactor * dictEnt
calc = (convFactor * dictEnt)
calc = (convFactor * dCallOne['tbsp'])
calc = (convFactor * (dCallOne['tbsp'])
(convFactor * dictEnt) = calc
(convFactor * (dCallOne['tbsp']) = calc
convFactor * dictEnt = calc
(convFactor * dCallOne['tbsp']) = calc


As far as I know, all of these, excapt maybe the bottom four, should get the correct answer because both
convFactor
,
dictEnt
, and
dCallOne
all get integers.

The full code is below.

import os

tbsp = {'tbsp' : 1 ,
'cup' : 0.0625 ,
'tsp' : 3 ,
'quart' : 0.015625 ,
'floz' : 0.5 ,
'pint' : 0.03125 ,
'gal' : 0.00390625 ,
'ml' : 14.7868 ,
'liter' : 0.0147868}
tsp = {'cup' : 0.0208333 , 'tbsp' : 0.333333 , 'quart' : 0.0052083333 , 'floz' : 0.1666666667 , 'pint' : 0.0104166667, 'gal' : 0.00130208323 , 'ml' : 4.92892 , 'liter' : 0.00492892}
dictcups = cups = {'tbsp' : 16 ,
'tsp' : 48 ,
'quart' : 0.25 ,
'floz' : 8.32674 ,
'pint' : 0.5 ,
'gal' : 0.0625 ,
'ml' : 236.588 ,
'liter' : 0.236588}
quart = {'cup' : 4 , 'tsp' : 192 , 'tbsp' : 64 , 'floz' : 32 , 'pint' : 2 , 'gal' : 0.25 , 'ml' : 946.353 , 'liter' : 0.946353}
floz = {'cup' : 0.125 , 'tsp' : 6 , 'quart' : 0.03125 , 'tbsp' : 2 , 'pint' : 0.0625 , 'gal' : 0.0078125 , 'ml' : 29.5735 , 'liter' : 0.0295735}
pint = {'cup' : 2 , 'tsp' : 96 , 'quart' : 0.5 , 'floz' : 16 , 'tbsp' : 32 , 'gal' : 0.125 , 'ml' : 473.176 , 'liter' : 0.473176}
gal = {'cup' : 16 , 'tsp' : 768 , 'quart' : 4 , 'floz' : 128 , 'pint' : 8 , 'tbsp' : 256 , 'ml' : 3785.41 , 'liter' : 3.78541}
ml = {'cup' : 0.0042267571 , 'tsp' : 0.202884 , 'quart' : 0.00105669 , 'floz' : 0.033814 , 'pint' : 0.00211338 , 'gal' : 0.000264172 , 'tbsp' : 0.067628 , 'liter' : 0.001}
liter = {'cup' : 4.226757063 , 'tsp' : 202.884 , 'quart' : 1.05669 , 'floz' : 33.814 , 'pint' : 2.11338 , 'gal' : 0.264172 , 'ml' : 1000 , 'tbsp' : 67.628}
acceptableInputs = ['1', '2', '3', '4', '5', '6', '7', '8', '9'] #This is used to check if what the user entered is one of the eight acceptable units

def takeUnit1 (): #Figure out what unit the user wants to convert
global convFactor
print ('Unit Converter')
print ('')
print ('')
print ('Select the unit you want to convert FROM')
print ('')
print ('1 Tbsp - Tablespoon')
print ('2 Tsp - Teaspoon')
print ('3 C - Cups')
print ('4 qt. - Quart')
print ('5 fl. oz. - Fluid Ounce')
print ('6 gal. - Gallon')
print ('7 ml - Milliliter')
print ('8 L - Liter')
print ('9 P - Pints')
convFROM = input('Unit: ')
convFactor = input('How many?: ')

if convFROM in acceptableInputs: #Check if input is acceptable
global convFROMconv
global dCallOne
if convFROM == '1':
convFROMconv = 'Tablespoons'
dCallOne = tbsp
takeUnit2() # Run the function to figure out what unit to convert to

elif convFROM == '2':
convFROMconv = 'Teaspoons'
dCallOne = tsp
takeUnit2() # Run the function to figure out what unit to convert to

elif convFROM == '3':
convFROMconv = 'Cups'
dCallOne = dictcups
takeUnit2() # Run the function to figure out what unit to convert to

elif convFROM == '4':
convFROMconv = 'Quarts'
dCallOne = quart
takeUnit2() # Run the function to figure out what unit to convert to

elif convFROM == '5':
convFROMconv = 'Fluid Ounces'
dCallOne = floz
takeUnit2() # Run the function to figure out what unit to convert to

elif convFROM == '6':
convFROMconv = 'Gallons'
dCallOne = gal
takeUnit2() # Run the function to figure out what unit to convert to

elif convFROM == '7':
convFROMconv = 'Milliliters'
dCallOne = ml
takeUnit2() # Run the function to figure out what unit to convert to

elif convFROM == '8':
convFROMconv = 'Liters'
dCallOne = liter
takeUnit2() # Run the function to figure out what unit to convert to

elif convFROM == '9':
convFROMconv = 'Pints'
dCallOne = pint
takeUnit2() # Run the function to figure out what unit to convert to

else:
print ('')

else:
print('That is not an acceptable input, please try again')


def takeUnit2 (): #This function is to figure out what unit the user wants to convert TO
os.system('cls')
print ('Select the unit you want to convert TO')
print ('1 Tbsp - Tablespoon')
print ('2 Tsp - Teaspoon')
print ('3 C - Cups')
print ('4 qt. - Quart')
print ('5 fl. oz. - Fluid Ounce')
print ('6 gal. - Gallon')
print ('7 ml - Milliliter')
print ('8 L - Liter')
print ('9 P - Pints')
convTO = input('Unit: ')

if convTO in acceptableInputs: #Checking if it is one of the 8 accepted units
global convTOname #Making convTOconv global
global TOfunc1
if convTO == '1': #This whole statement converts the input number to its corresponding name
convTOname = 'tbsp'
TOfunc1 = 'TOtbsp'
TOtbsp()

elif convTO == '2':
convTOname = 'tsp'
TOfunc1 = 'TOtsp'
TOtsp()

elif convTO == '3':
convTOname = 'cup'
TOfunc1 = 'TOcups'
TOcup()

elif convTO == '4':
convTOname = 'quart'
TOfunc1 = 'TOquarts'
TOquart()

elif convTO == '5':
convTOname = 'floz'
TOfunc1 = 'TOfloz'
TOfloz()

elif convTO == '6':
convTOname = 'gal'
TOfunc1 = 'TOgal'
TOgal()

elif convTO == '7':
convTOname = 'ml'
TOfunc1 = 'TOml'
TOml()

elif convTO == '8':
convTOname = 'liter'
TOfunc1 = 'TOliters'
TOliter()

elif convTO == '9':
convTOname = 'pint'
TOfunc1 = 'TOpint'
TOpint()


else: #Statement requires an else, not intended to ever be used
print ('')

else:
print('That is not an acceptable input, please try again')


def TOtbsp ():
os.system('cls')
print ('Convert ' + convFROMconv + ' to: tablespoons')
dictEnt = dCallOne['tbsp']
print (dCallOne['tbsp'])
print (dCallOne)
print (dictEnt)
print (convFactor)
calc = convFactor * dictEnt
print(calc)

def TOtsp ():
os.system('cls')
print ('Convert ' + convFROMconv + ' to: teaspoons')
print (dCallOne)
calc = dCallOne['tsp']
print(calc)

def TOcup ():
os.system('cls')
print ('Convert ' + convFROMconv + ' to: cups')
print (dCallOne)
calc = dCallOne['cup']
print(calc)

def TOquart ():
os.system('cls')
print ('Convert ' + convFROMconv + ' to: quarts')
print (dCallOne)
calc = dCallOne['quart']
print(calc)

def TOfloz ():
os.system('cls')
print ('Convert ' + convFROMconv + ' to: fluid ounces')
print (dCallOne)
calc = dCallOne['floz']
print(calc)

def TOml ():
os.system('cls')
print ('Convert ' + convFROMconv + ' to: milliliters')
print (dCallOne)
calc = dCallOne['ml']
print(calc)

def TOgal ():
os.system('cls')
print ('Convert ' + convFROMconv + ' to: gallons')
print (dCallOne)
calc = dCallOne['gal']
print(calc)


def TOpint ():
os.system('cls')
print ('Convert ' + convFROMconv + ' to: pints')
print (dCallOne)
calc = dCallOne['pint']
print(calc)

def TOliter ():
os.system('cls')
print ('Convert ' + convFROMconv + ' to: liters')
print (dCallOne)
calc = dCallOne['liter']
print(calc)

takeUnit1()

Answer Source

In Python 3, input() returns a string (even if the user enters a number), and so convFactor = input('How many?: ') will set the value of convFactor to a string. Multiplying a string by a number (as happens in calc = convFactor * dictEnt) simply repeats the string that many times, and so you end up with sixteen 1's. To fix this, use int() to convert convFactor to a number, ideally right after the call to input():

convFactor = int(input('How many?: '))