Search code examples
pythonvariablesdictionaryoperations

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

Solution

  • 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?: '))