[Tutor] creating a dictionary for capital quiz program

Peter Otten __peter__ at web.de
Tue Jun 2 16:15:15 CEST 2015


ZBUDNIEWEK. JAKUB wrote:

> I'm a newbie, but was able to tune it to correctly reply to user inputs.

> 2. Why (on Windows) do I have to give inputs in quotes not to cause an
> error (for ll input the error is ' NameError: name 'll' is not defined')?

If you are running the script under Python 2 you should use
raw_input() instead of input(). input() will take the user input and also 
run eval() on it:

Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> input("? ")
? 1 + 1
2
>>> raw_input("? ")
? 1 + 1
'1 + 1'

Python 3 has no raw_input() and input() will behave like raw_input() in 
Python 2.

> 1. My question is can it be optimized in any way?

In Python 2 capital.keys() builds a list. You can avoid that by iterating 
over the dict directly:

for k in capitals:
    ...

Not an optimization, but if the user enters neither Y nor N you might ask 
again instead of assuming Y.


> def main():
> 
>     right = 0
>     wrong = 0
>     capitals = {'Alabama': 'Montgomery', 'Alaska': 'Juneau', "Arizona":
>     'Phoenix', \
>                'Arkansas': 'Little Rock', 'California': 'Sacramento', \
>                'Colorado': 'Denver', 'Connecticut': 'Hartford',
>                'Delaware': 'Dover', \ 'Florida': 'Tallahassee', \
>                'Georgia': 'Atlanta', 'Hawaii': 'Honolulu', \
>                'Idaho': 'Boise',  \
>                'Illinois': 'Springfield', 'Indiana': 'Indianapolis', \
>                'Iowa': 'Des Moines', \
>                'Kansas': 'Topeka', 'Kentucky': 'Frankfort', \
>                'Louisiana': 'Baton Rouge', \
>                'Maine': 'Augusta', 'Maryland': 'Annapolis', \
>                'Massachusetts': 'Boston', \
>                'Michigan': 'Lansing', 'Minnesota': 'Saint Paul', \
>                'Mississippi': 'Jackson', \
>                'Missouri': 'Jefferson City', 'Montana': 'Helena', \
>                'Nebraska': 'Lincoln', \
>                'Nevada': 'Carson City', 'New Hampshire': 'Concord', \
>                'New Jersey': 'Trenton', \
>                'New Mexico': 'Santa Fe', 'New York': 'Albany', \
>                'North Carolina': 'Raleigh', \
>                'North Dakota': 'Bismarck', 'Ohio': 'Columbus', \
>                'Oklahoma': 'Oklahoma City', \
>                'Oregon': 'Salem', 'Pennsylvania': 'Harrisburg', \
>                'Rhode Island': 'Providence', \
>                'South Carolina': 'Columbia', \
>                'South Dakota': 'Pierre', 'Tennessee': 'Nashville', \
>                'Texas': 'Austin', 'Utah': 'Salt Lake City', \
>                'Vermont': 'Montpelier', \
>                'Virginia': 'Richmond', 'Washington': 'Olympia', \
>                'West Virginia': 'Charleston', \
>                'Wisconsin': 'Madison', 'Wyoming': 'Cheyenne'}
> 
>     for k in capitals.keys():
>         state = input('Enter the capital of '+k+' :')
>         if state.upper() == capitals[k].upper():
>             right += 1
>             print('Correct')
>         else:
>             wrong += 1
>             print('Incorrect')
>         choice = input('Do you want to play again y/n: ')
>         if choice.upper() == 'N':
>             print('end of game')
>             break
>         elif choice.upper() != 'Y':
>             print("invalid choice")
> 
>     print('Number of correct answers is: ', right)
>     print("Number of incorrect answers is:", wrong)
> 
> main()
> 
> Regards,
> Jakub




More information about the Tutor mailing list