Python Forum

Full Version: element in list detection problem
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I am trying to make a UK grading system. The console based app will take name and grade as inputs, save it into a list of dictionaries, convert that list of dictionaries to add a key value pair that represents what grade the student got from. so above 70% is first, above 60% is 2:1 etc. WHat i have problem is with my process name function. basically it takes an input and if the input contains characters that are not part of the english alphabet then it loops and asks for a new name but not before printing an appropriate error message. It keeps looping until the name input contains only letters of the english alphabet. When that occurs the function returns the name. my code follows


def process_name():
    ALPHABET = ["a","b","c","d","e","f","g",
                "h","i","j","k","l","m","n",
                "o","p","q","r","s","t","u",
                "v","w","y","y","z"]
    detected=True
    while True:
        name=input("What is the student's name?\n").lower()
        for char in name:
            if char not in ALPHABET:
                detected=False
        if detected==True:
            return name
        else:
            print(f"{name} contains characters that are not part of the English alphabet!!\n"
                  f"Please enter a valid name!!\n")
the problem is that it doesn't always work correctly. It always gives the error and loops if the name input has symbols or numbers but sometimes a clean input like "jim" or "tim" still causes the loop to keep going. as you can see i have the f string to inform the user that the input has characters that are not a part of the alphabet and even if i give it appropriate input it still gives me the error message and loops instead of returning the input to the main function of the program. Sorry if its confusing im just dazzled by the result. i tried setting the alphabet as a string or a list and it still sometimes does not work appropriately. Please help
(Apr-09-2024, 08:15 PM)jacksfrustration Wrote: [ -> ]sometimes a clean input like "jim" or "tim" still causes the loop to keep going.
I think it is because you don't reinitialize detected to True when the while loop starts again. You could move line 6 inside the while loop to correct this.

You can also avoid completely the need for the detected variable by using the for ... else structure.
def process_name():
    ALPHABET = ["a","b","c","d","e","f","g",
                "h","i","j","k","l","m","n",
                "o","p","q","r","s","t","u",
                "v","w","y","y","z"]
    while True:
        name=input("What is the student's name?\n").lower()
        for char in name:
            if char not in ALPHABET:
                break # this exits the for loop as soon as a bad character is detected
        else: # this part is executed only if the for loop completed without encountering a 'break' statement.
            return name
        print(f"{name} contains characters that are not part of the English alphabet!!\n"
                  f"Please enter a valid name!!\n")
Looks like a good place to use "all".
from string import ascii_lowercase

def process_name():
    while True:
        name = input("What is the student's name?\n")
        if all(c in ascii_lowercase for c in name.lower()):
            return name
        print(f"{name} contains characters that are not part of the English alphabet!!\n"
            "Please enter a valid name!!\n")

print("Welcome", process_name())
Sorry, buggy post.
I believe, in Britain, it is customary to write ones name with a capital letter at the beginning.

from string import ascii_lowercase, ascii_uppercase

alphi = ascii_lowercase + ascii_uppercase + ' '
def washyename(name):
    for n in name:
        if n not in alphi:
            return False
    return True

# assume most people know their name and can write it correctly
# don't go straight to a while loop
name=input("What is your name? Get it right boy! ")

# some people will get it wrong
if not washyename(name):    
    while not washyename(name):
        print(f'This name {name} is not acceptable, let\'s do that again and try get it right this time! ... ')
        name=input("What is your name? ")
        if washyename(name):
            print('Amazing, you got it right!')
Quote:I believe, in Britain, it is customary to write ones name with a capital letter at the beginning.
You can use lower() for the comparison without changing the entered name.

It makes more sense to use set operations for this problem.
from string import ascii_lowercase


alphi = set(ascii_lowercase + ' ')


def enter_name():
    while True:
        name = input("What is the student's name?\n").lower()
        if len(set(name.lower()) - alphi) == 0:
            return name
        print(
            f"{name} contains characters that are not part of the English alphabet!!\n"
            "Please enter a valid name!!\n"
        )


print(enter_name())