Simple unit converter in Python
Question:
I am new to programming and I am trying to make a simple unit converter in python. I want to convert units within the metric system and metric to imperial and vice-versa. I have started with this code and I found this method is slow and in-efficient, How can I code this more efficiently?
import math
import time
"""Unit Converter"""
#variable setting
cat = raw_input ("Which category would you like to convert? we support length(l) and Weight(w): ")
if cat == ("l"):
unit1 = raw_input ("Which unit would you like to convert from: ")
unit2 = raw_input ("Which unit would you like to convert to: ")
num1 = raw_input ("Enter your value: " )
##Calculations
if unit1 == "cm" and unit2 == "m":
ans = float(num1)/100
elif unit1 == "mm" and unit2 == "cm":
ans = float(num1)/10
elif unit1 == "m" and unit2 == "cm":
ans = float(num1)*100
elif unit1 == "cm" and unit2 == "mm":
ans = float(num1)*10
elif unit1 == "mm" and unit2 == "m":
ans = float(num1)/1000
elif unit1 == "m" and unit2 == "mm":
ans = float(num1)*1000
elif unit1 == "km" and unit2 == "m":
ans = float(num1)*1000
elif unit1 == "m" and unit2 == "km":
ans = float(num1)/1000
elif unit1 == "mm" and unit2 == "km":
ans = float(num1)/1000000
Thanks for your help.
Answers:
You could use a dictionary with conversion factors, and a function that calls them.
def convert_SI(val, unit_in, unit_out):
SI = {'mm':0.001, 'cm':0.01, 'm':1.0, 'km':1000.}
return val*SI[unit_in]/SI[unit_out]
Example:
>>> convert_SI(1, 'm', 'km')
0.001
>>> convert_SI(1, 'km', 'm')
1000.0
>>> convert_SI(1, 'cm', 'm')
0.01
You can use dictionary with this example.
def handle_one():
print 'one'
def handle_two():
print 'two'
def handle_three():
print 'three'
print 'Enter 1 for handle_one'
print 'Enter 2 for handle_two'
print 'Enter 3 for handle_three'
choice=raw_input()
{
'1': handle_one,
'2': handle_two,
'3': handle_three,
}.get(choice)()
For those happy to use an external package, Axiompy is an option.
Installation: pip install axiompy
from axiompy import Units
units = Units()
print(units.unit_convert(3 * units.metre, units.foot))
>>> <Value (9.84251968503937 <Unit (foot)>)>
All standard unit conversions (kilo, hecto, deka, base, deci, centi, milli)
Updated @ryanjdillon’s answer to support any of the following conversions:
convert_si(10, 'kilograms', 'grams')
convert_si(5, 'liter', 'kiloliters')
convert_si(6, 'millimeter', 'meter')
convert_si(1, 'kilo', '') # no need to specify type of measurement
convert_si(4, 'hectometer', 'kilometer')
convert_si(7, 'hecto', 'deka') # no need to specify type of measurement
convert_si(3, 'hectogram', 'decigram')
convert_si(2, 'centiliter', 'kiloliter')
convert_si(2, 'centimeter') # without the 3rd argument converts to base unit
Here is the code:
def clean_units(unit):
unit = unit.rstrip('s') # remove plural
words_to_remove = ['meter', 'liter', 'gram'] # remove type of unit
for word in words_to_remove:
unit = unit.replace(word, '')
return unit
def convert_si(val, unit_in, unit_out=''):
SI = {'milli': 0.001, 'centi': 0.01,
'deci': 0.1, '': 1.0, 'deka': 10,
'hecto': 100, 'kilo': 1000}
unit_in = clean_units(unit_in)
unit_out = clean_units(unit_out)
return val*SI[unit_in]/SI[unit_out]
You can also use the python package called pint for this – see article here:
https://www.blog.pythonlibrary.org/2021/09/01/unit-conversion-pint/
I am new to programming and I am trying to make a simple unit converter in python. I want to convert units within the metric system and metric to imperial and vice-versa. I have started with this code and I found this method is slow and in-efficient, How can I code this more efficiently?
import math
import time
"""Unit Converter"""
#variable setting
cat = raw_input ("Which category would you like to convert? we support length(l) and Weight(w): ")
if cat == ("l"):
unit1 = raw_input ("Which unit would you like to convert from: ")
unit2 = raw_input ("Which unit would you like to convert to: ")
num1 = raw_input ("Enter your value: " )
##Calculations
if unit1 == "cm" and unit2 == "m":
ans = float(num1)/100
elif unit1 == "mm" and unit2 == "cm":
ans = float(num1)/10
elif unit1 == "m" and unit2 == "cm":
ans = float(num1)*100
elif unit1 == "cm" and unit2 == "mm":
ans = float(num1)*10
elif unit1 == "mm" and unit2 == "m":
ans = float(num1)/1000
elif unit1 == "m" and unit2 == "mm":
ans = float(num1)*1000
elif unit1 == "km" and unit2 == "m":
ans = float(num1)*1000
elif unit1 == "m" and unit2 == "km":
ans = float(num1)/1000
elif unit1 == "mm" and unit2 == "km":
ans = float(num1)/1000000
Thanks for your help.
You could use a dictionary with conversion factors, and a function that calls them.
def convert_SI(val, unit_in, unit_out):
SI = {'mm':0.001, 'cm':0.01, 'm':1.0, 'km':1000.}
return val*SI[unit_in]/SI[unit_out]
Example:
>>> convert_SI(1, 'm', 'km')
0.001
>>> convert_SI(1, 'km', 'm')
1000.0
>>> convert_SI(1, 'cm', 'm')
0.01
You can use dictionary with this example.
def handle_one():
print 'one'
def handle_two():
print 'two'
def handle_three():
print 'three'
print 'Enter 1 for handle_one'
print 'Enter 2 for handle_two'
print 'Enter 3 for handle_three'
choice=raw_input()
{
'1': handle_one,
'2': handle_two,
'3': handle_three,
}.get(choice)()
For those happy to use an external package, Axiompy is an option.
Installation: pip install axiompy
from axiompy import Units
units = Units()
print(units.unit_convert(3 * units.metre, units.foot))
>>> <Value (9.84251968503937 <Unit (foot)>)>
All standard unit conversions (kilo, hecto, deka, base, deci, centi, milli)
Updated @ryanjdillon’s answer to support any of the following conversions:
convert_si(10, 'kilograms', 'grams')
convert_si(5, 'liter', 'kiloliters')
convert_si(6, 'millimeter', 'meter')
convert_si(1, 'kilo', '') # no need to specify type of measurement
convert_si(4, 'hectometer', 'kilometer')
convert_si(7, 'hecto', 'deka') # no need to specify type of measurement
convert_si(3, 'hectogram', 'decigram')
convert_si(2, 'centiliter', 'kiloliter')
convert_si(2, 'centimeter') # without the 3rd argument converts to base unit
Here is the code:
def clean_units(unit):
unit = unit.rstrip('s') # remove plural
words_to_remove = ['meter', 'liter', 'gram'] # remove type of unit
for word in words_to_remove:
unit = unit.replace(word, '')
return unit
def convert_si(val, unit_in, unit_out=''):
SI = {'milli': 0.001, 'centi': 0.01,
'deci': 0.1, '': 1.0, 'deka': 10,
'hecto': 100, 'kilo': 1000}
unit_in = clean_units(unit_in)
unit_out = clean_units(unit_out)
return val*SI[unit_in]/SI[unit_out]
You can also use the python package called pint for this – see article here:
https://www.blog.pythonlibrary.org/2021/09/01/unit-conversion-pint/