Search code examples
pythonpython-3.xlistdictionaryenumerate

Reference list index to enumerate value


I have a program which checks an outlook inbox for attachments from specific senders in a dictionary. Python - Outlook search emails within specific range only

That program works fine, and now I'm trying to expand on it by giving the user the ability to choose a specific sender from the dictionary, so as to only search their emails. This code is within the previous program.

The dictionary I have is senderDict = {[email protected] : Sender Name}

To turn it into a menu of values to choose from I've used enumerate:

listSender = list(senderDict.values())

for count, item in enumerate(listSender,1):
    print(count, item)

print("There are", len(listSender), "items.")

while True:
    senderNum = int(input("Choose a sender (zero for any): "))        
    try:
        if senderNum <= len(listSender) and senderNum >= 0:
            #senderNum = int(input("Choose a sender (zero for any): "))
            print("you chose", listSender[senderNum])
            break

        elif senderNum == 0:
            print("Searching for any sender")
            break

        elif senderNum < 0:
            print("Cannot choose a negative number.")
            continue

    except ValueError: #Not int
        print("You did not enter a valid number (ValueError)")
        input()

    except IndexError: #outside range
        print("You did not enter a valid number (IndexError)")
        input()

The issue is that choosing zero will choose the zero index, instead of 'search any'. How do I make the list index match the enumerate values?

Also, entering a non-number or blank input crashes the program, so I'm not certain what exception covers that, I thought it fell under ValueError.

I'm not really sure if I even need to turn the dictionary into a list, but I had read that it was necessary for enumerate to work so I just went with it.


Solution

  • Thanks for all the helpful responses!

    Instead of trying to change the value of the input, I decided to insert a list option for 'Search Any' after converting the dictionary to a list, then let enumerate start from zero. This way I don't have to do any addition or subtraction and the index values still match the input.

    listSender = list(senderDict.values())
    listSender.insert(0, "Search Any")
    
    for count, item in enumerate(listSender):
        print(count, item)