This is the code I wrote for a project in SDEV 300:
""" Kassandra Ring 3047272***** 1/28/2023 ***** SDEV 300 ""
#Program asks user for menu selection to perform various functions using data structures
#There are three typeas of data structures available lists, tuples, and dictionaries
#I chose nested dictionaries because it made it easy to break down the state name and its
#Populations into lists.
from operator import itemgetter #For search and gathering graph data
import sys #For exit
import matplotlib.pyplot as plt #For images and plots
#Dictionary with all of the information
state_info = {
'alabama' :
{'Capital' : 'Montgomery', 'Population' : 5074296, 'Flower' : 'Camellia'},
'alaska' :
{'Capital' : 'Juneau' , 'Population' : 733583, 'Flower' : 'Alpine Forget-me-not'},
'arizona' :
{'Capital' : 'Phoenix' , 'Population' : 7359197, 'Flower' : 'Saguaro Cactus Blossom'},
'arkansas' :
{'Capital' : 'Little Rock' , 'Population' : 3045637, 'Flower' :'Apple Blossom'},
'colorado' :
{'Capital' : 'Denver' , 'Population' : 5839926, 'Flower' : 'Rocky Mountain Columbine'},
'california' :
{'Capital' : 'Sacramento' , 'Population' : 39029342, 'Flower' : 'California Poppy'},
'connecticut' :
{'Capital' : 'Hartford' , 'Population' : 3626205, 'Flower' : 'Mountain Laurel'}
}<
#Function to display all data in state_info
def display():
'''Function display's all information in dictionary state_info'''
#Loop to collect and display each state one by one
for name, stats in sorted(state_info.items()):
flower = plt.imread(f"images/{name}.jpg")
print(f'\nName: {name}')
print(('Capital: '), (stats['Capital']))
print(('Population: '), (stats['Population']))
print(('Flower:'), (stats['Flower']))
print((plt.imshow(flower), (plt.show(block=True))))
#Function to search for a specific state
def search():
'''Function to search for a specific state'''
#Loop to check user input
while True:
user_search = input("Enter state you wish to view:\n")
if user_search.lower() not in state_info:
print("Not a valid state")
else:
break
#Loop to display state selected only
for name, stats in state_info.items():
if user_search.lower() == name:
flower = plt.imread(f"images/{name}.jpg")
print(f'\nName: {name}')
print(('Capital: '), (stats['Capital']))
print(('Population: '), (stats['Population']))
print(('Flower:'), (stats['Flower']))
print((plt.imshow(flower), (plt.show(block=True))))
#Function to sort out the top 5 populations and display them as a bar graph
def graph():
'''Function to graph top 5 populations'''
#Empty lists to be filled
state_list = []
population_list = []
#Loop to fill above lists
for name, stats in state_info.items():
#Fills state_list with the names of the states in state_info
state_list.append(name)
#Fills population_list with coresponding populations in state_info
population_list.append(stats['Population'])
#Puts the two now full lists into an empty dictionary established globally
state_pops = dict(zip(state_list, population_list))
#Takes the top five populations and their names
#and puts them into new dictionary called top_pops
top_pops = dict(sorted(state_pops.items(),
key = itemgetter(1), reverse=True)[:5])
#Variables and labels to make the bar graph
states = list(top_pops.keys())
populations = list(top_pops.values())
plt.xlabel("State")
plt.ylabel("Populations")
plt.title("Top 5 states and their populations")
plt.bar(states, populations, color = 'red')
#Displays bar graph
plt.show()
#Function to update a specific state's population value
def update():
'''Fucntion to update a specific states population'''
#Loop to check user's input and insure they request a state in the list
while True:
user_update = input("What state do you wish to update?\n")
#Condition for bad input
if user_update.lower() not in state_info:
print("Not a valid state")
else:
break
#Loop to check second user input
while True:
try:
new_population = int(input("What is the new population?\n"))
#Condition for entering negative number
if new_population < 0:
print("Enter a positive number")
else:
break
#Condition for not entering a number
except ValueError:
print("Please enter a nuber")
#Loop to change the value of the population of the selected state
for name, stats in state_info.items():
#Changes the value
if user_update.lower() == name:
stats['Population'] = new_population
#Prints user's input
print((user_update), ("population changed to: "), (new_population))
#Function to print menu
def menu():
'''Menu'''
print('''\nWhat do you want to do?
1. Display all U.S. States in Alphabetical including Capital, State Population, and Flower
2. Search for a specific state
3. Display bar graph of top 5 populated states
4. Update state population
5. Exit''')
#Main function, prints greeting and loops menu
def main():
'''Hello and welcome to Nothing is Real's State database!
Here you can access the a dictionary compiled of each state's statistics
including capital, population, and state flower'''
#Prints greeting from docstring
print(main.__doc__)
while True:
#Loop to ask user for menu selection and validate selection
while True:
try:
menu()
menu_choice = int(input("Enter your number selection below:\n"))
if (menu_choice < 1 or menu_choice > 6):
print("Please enter a number 1-5")
else:
break
except ValueError:
print("Please enter a number")
#Conditions for entering numbers 1-5
if menu_choice == 5:
break
if menu_choice == 1:
display()
if menu_choice == 2:
search()
if menu_choice == 3:
graph()
if menu_choice == 4:
update()
#Calls main function
main()
#Exits program when main function is done
sys.exit("Thank you for using a Nothing is Real Product. Good Bye!")