V Anon
V Anon

Reputation: 543

comparison within loop while maintaining value

I am trying to make a python program that
1. compares the first and last letter of a word
2. tell whether the words inputted to the program are in alphabetical order

e.g.) alaska baobab cadillac => would pass e.g.) alaska baobab greg => would not pass

my code is shown below

num_words = int(input())

while num_words > 0:
    my_word = str(input())
    num_words -= 1

    alphabet_order = ord(my_word[0].lower())

    if my_word[0].lower() != my_word[-1].lower() or alphabet_order != ord(my_word[0].lower()):
        print(my_word)
        break
    alphabet_order += 1

    if alphabet_order == ord('z') + 1:
        alphabet_order = ord('a')

else:
    print('no mistake')

Hi everyone on stack.

I am pretty new to programming and I am starting to find assigning variables within a loop very cumbersome.

It seems like my variable alphabet_order keeps getting renewed every time when the loop takes in a new input.

What would be a great way to steadily increase the alphabet_order variable by 1 while only renewing ord(my_word[0]) every loop?

Upvotes: 3

Views: 81

Answers (2)

MooingRawr
MooingRawr

Reputation: 4991

Few notes, while loops are good for when you don't know how many times you are going to loop. for loops are good for when you know how many items you are looping. In this case we have a known number of words we are to check so using a for loop makes more sense. This way we don't need to take an input on telling us how many words we expect.

Also your code wasn't dealing with the words you were dealing with the sentence, so instead you should split() your input by the space to get a list of the words to operate on. for loops can iterate through a list which is useful for us.

Note that for loops also can take an else, the else section runs after the for loop is finished all the elements it's iterating through and we know that if the for is finish all the words in the list, then the else section will kick in. If we break out, then the else doesn't run.

The rest you more or less had it, just need a starting ord('a') would have made life easier.

my_word = input() #take a sentence such as alaska baobab cadillac 
current_ord = ord('a')
for each in my_word.split(' '):
    if each[0].lower() != each[-1].lower() or current_ord != ord(each[0].lower()):
        print(f"bad word {each}")
        break
    current_ord += 1

    if current_ord == ord('z') + 1:
        current_ord = ord('a')

else:
    print('no mistake')

Upvotes: 1

Vineeth Sai
Vineeth Sai

Reputation: 3447

Maybe this is helpful to you. Instead of initializing it inside the loop, declare it outside the loop and assign it differently based on the conditions.

Tip: having while num_words > 0 is redundant because it will terminate automatically when it hits 0 as it is treated as False. And there is no need to convert int to a str type as it is str by default.

num_words = int(input("Enter a number"))

alphabet_order = None

while num_words:
    my_word = input("Enter a word")
    num_words -= 1

    if alphabet_order is None: # happens only once
        alphabet_order = ord(my_word[0].lower())

    if ord(my_word[0].lower()) >= alphabet_order:
        print('ok')
        alphabet_order = ord(my_word[0].lower()) # update alphabet_order
    else:
        print('not ok EXITING')
        break # closing loop

Upvotes: 0

Related Questions