Python Forum
User Input to Choose from Dictionary - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: User Input to Choose from Dictionary (/thread-9200.html)



User Input to Choose from Dictionary - anelliaf - Mar-26-2018

Hello,

I'm looking to post a list of databases from a dictionary, then from the user input choose which database they want to connect.

import pprint, os

db_list = {
    1: {'name': 'TEST11C'},
    2: {'name': 'TEST12C'},
}
print("Databases:")
for x, y in db_list.items():
    print(x, y)

while True:
    print("Select a database: ")
    name = int(input())

    if name in db_list.keys():
        print("You have chosen: " + name)
    else:
        print('You chosen wrong!')
The user will select a database value based on the key integers of [1,2]. If they select out of that range they'll receive an error. If they select within the range it will take the value of the database.

Any help is appreciated.

Thanks,
Frank


RE: User Input to Choose from Dictionary - nilamo - Mar-26-2018

Doesn't what you already have do that?


RE: User Input to Choose from Dictionary - anelliaf - Mar-27-2018

No. When I enter a '1' for 'TEST11C' or '2' for the other one, I receive 'You chosen wrong!' when I should I receive the first part of the IF condition.

Databases:
1 {'name': 'TEST11C'}
2 {'name': 'TEST12C'}
Select a database:
1
You chosen wrong!
Select a database:

That was after I removed 'int' from input.


RE: User Input to Choose from Dictionary - buran - Mar-27-2018

Your code works for me if I correct the TypeError
Error:
Databases: (1, {'name': 'TEST11C'}) (2, {'name': 'TEST12C'}) Select a database: 1 Traceback (most recent call last): print("You have chosen: " + name) TypeError: cannot concatenate 'str' and 'int' objects >>>



RE: User Input to Choose from Dictionary - anelliaf - Mar-27-2018

Got it, thx for that!

Here's my fix:

while True:
    print("Select a database: ")
    name = int(input())

    if name in db_list.keys():
        name = int(name)
        print("You have chosen: ", name, db_list[name])
    else:
        print('You chosen wrong!')
One other thing, how do I display only the database name and not the dictionary entry?

Output:

Select a database:
1
You have chosen: 1 {'name': 'TEST11C'}

Desired output:

Select a database:
1
You have chosen: TEST11C


RE: User Input to Choose from Dictionary - anelliaf - Mar-27-2018

Finished code:

db_list = {
    1: {'name': 'TEST11C'},
    2: {'name': 'TEST12C'},
}
print("Databases:")
for x, y in db_list.items():
    print(x, ':', db_list[x]['name'])

while True:
    print("\nSelect a database:")
    name = int(input())

    if x in db_list.keys():
        x = int(x)
        print("\nYou have chosen {0}".format(db_list[x]['name']))
    else:
        print('\nYou chosen wrong!')
Thanks for the help!


RE: User Input to Choose from Dictionary - buran - Mar-27-2018

A few comments:
  • db_list - this variable name implies that it's a list, while in fact you have dict. You may decide to switch to list (see my next comment)
  • dict is not ordered. In python3.6 the order of elements is preserved, but according to docs this is considered implementation detail and should not be relied upon. In other words the order in which you print dict items may be different from what you expect.
  • line#13 - I expect you want to use name, not x. As it is now x is the last item from previous for loop, thus will always be present in db_list.keys(). Here keys() is not necessary, in always checks in dict.keys() by default
  • line #15 - again you want to use name (i.e. the user input from line#11, not x

I just saw your other thread where you do use list, not dict
https://python-forum.io/Thread-Display-List-for-User-Input
I will not merge both threads as the other one is much older, but I post this link for completeness.
db_list = ['TEST11C', 'TEST12C']
print("Available Databases:")
for i, db_name in enumerate(db_list, start=1):
    print ('{}. {}'.format(i, db_name))
 
while True:
    try:
        selected = int(input('Select a database (1-{}): '.format(i)))
        db_name = db_list[selected-1]
        print('You have selected {}'.format(db_name))
        break
    except (ValueError, IndexError):
        print('This is not a valid selection. Please enter number between 1 and {}!'.format(i))



RE: User Input to Choose from Dictionary - anelliaf - Mar-27-2018

All your points taken into consideration. I'm unsure which direction to go in order to present the user a list of values. I started off with a list but was having trouble presenting the values. With a dictionary, it seems much simpler. I'm a beginner to programming so all the feedback you provided is much appreciated.

I updated my code with the following, per your advice:

databases = {
    1: {'name': 'TEST11C'},
    2: {'name': 'TEST12C'},
}

# Print databases listed in dictionary
print("Databases:")
for x, y in databases.items():
    print(x, ':', databases[x]['name'])

while True:
    print("\nSelect a database:")
    d_val = int(input())

    if d_val in databases.keys():
        d_val = int(d_val)
        print("\nYou have chosen {0}".format(databases[d_val]['name']))
    else:
        print('\nYou chosen wrong!')



RE: User Input to Choose from Dictionary - buran - Mar-27-2018

I updated my post #7 with an example


RE: User Input to Choose from Dictionary - anelliaf - Mar-27-2018

Awesome, got it! Thanks a lot for the example and advice.