Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to Make a Loop that keeps the user in an entry loop til the input matches a key value in a list of dicitonaries?

I am in the process of trying to create a loop, that allows a user to delete an item if the input matches a key value found in a list of dictionaries.

Here is my current list of dicitionaries.


{'Item #': 1, 'Price': 3.99, 'Quantity': 1, 'Name': 'Muffin 1'}
{'Item #': 2, 'Price': 4.99, 'Quantity': 2, 'Name': 'Muffin 2'}
{'Item #': 3, 'Price': 5.99, 'Quantity': 3, 'Name': 'Cookie 1'}
{'Item #': 4, 'Price': 6.99, 'Quantity': 4, 'Name': 'Cookie 2'}
{'Item #': 5, 'Price': 7.99, 'Quantity': 50, 'Name': 'Muffin 3'}

I already have a valid method that deletes the specific dictionary, based upon the value of the item # key.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Here is my relevant code:


def enter_data(self, message, typ):
            while True:
                try:
                    v = typ(input(message))
                except ValueError:
                    print(f"Thats not an {typ}!")
                    continue
                else:
                    break
            return v

def delete_item_interaction(self):
            while True:
                delete_item_number = self.enter_data("Please enter the item # of the item you would like to delete\n", int)
                for item item in self.database.result
                    if item["Item #"] != delete_item_number:
                       #keep in loop? 
                       #print item not found in any dictionary Item # value in list
                    else:
                       #break?
            self.database.delete_item(delete_item_number)
            print("Item Deleted! Check Inventory again for a refresh!")

I am trying to make a loop, but seem to be struggling with the logic and formatting behind it. I would like something similiar to what I did with enter_data, in which it keeps the user in a input loop, until a valid entry is given. For example, with delete_item_interaction, it should

  1. In the loop, ask the user for the input of the Item# they would like to delete
  2. For every dictionary in the list, search if any of them have the input equal to their "Item #" key value
  3. If found print item found! and exit the loop and send the input to the method that deletes the item
  4. If not found in any of the dictionaries "Item #" key values, print Item not found, and circle back to the beginning of the loop, to ask for another input.

I understand the logic behind what I am looking for and want, but seem to be having trouble
formatting it, and the inclusion of the for loop confuses me. How would I make this method do this?

>Solution :

With least possible modification to the provided code, since you have two loops a for loop inside a while loop, you can create a flag variable item_found inside the while loop which is initially False, then when you are iterating the values in for loop, you can set the variable to True and break the for loop. Once you are outside the for loop, you can check if the flag is True or not and then decide whether to break the while loop or to continue

while True:
    delete_item_number = self.enter_data("Please enter the item # "
                                         "of the item you would like to delete\n", 
                                         int)
    item_found = False
    for item  in self.database.result
        if item["Item #"] == delete_item_number:
            item_found = True
            break
        # keep in loop? 
        # print item not found in any dictionary Item # value in list
    if item_found:
        self.database.delete_item(delete_item_number)
        print("Item Deleted! Check Inventory again for a refresh!")
    else:
        continue

And in fact, you can even bring item_found outside the while loop and run the while loop based on the flag value, something likea:

item_found = False
while not item_found:
 .
 .
 .
 .
 for ... :
    if item["Item #"] == delete_item_number:
        item_found = True
 if item_found:
    self.database.delete_item(delete_item_number)
    print("Item Deleted! Check Inventory again for a refresh!")
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading