Home > other >  How do I parse a string without running into infinite loops?
How do I parse a string without running into infinite loops?

Time:10-26

Hello everyone I have a question regarding a parsing of string and this is the code I have so far:

sentence =' '

while sentence != 'q':
    sentence = input('Please enter your input: ').split(',')
    if len(sentence) > 1:
        print('First word: {sentence[0]}')
        print('Second word: {sentence[1]}')
        continue
    elif len(sentence) == 1:
        print('Error no comma.')
        continue
    elif sentence == 'q':
        break

And the output will be if there is no comma inputted will give me the following:

  Enter input string:
                     Jill Allen
  Error: No comma in string.

and it will keep on asking me for a string until I entered q for quit and the program exits as follows:

 Enter input string:
 Jill, Allen
 First word: Jill
 Second word: Allen

 Enter input string:
 Golden , Monkey
 First word: Golden
 Second word: Monkey

 Enter input string:
 Washington,DC
 First word: Washington
 Second word: DC

 Enter input string:
 q

My problem is I am unable to quit the infinite loop. Can anyone help me on this? I think the program is unable to distinguish 'Jill Allen' from 'q' since both of them have len(sentence) == 1 and that is the problem as it gives me Error no comma and asked for an input over and over.

CodePudding user response:

You have to change the places of the last two if statements. Because the last if statement never gets executed as if you split sentence which is just q, its length is 1.

sentence =' '

while sentence != 'q':
    sentence = input('Please enter your input: ').split(',')
    if len(sentence) > 1:
        print('First word: {sentence[0]}')
        print('Second word: {sentence[1]}')
        continue
    elif sentence == 'q':
        break
    elif len(sentence) == 1:
        print('Error no comma.')
        continue

CodePudding user response:

Check this code. It's working fine for me.

def wordPrinter(text):
    if len(sentence) > 1:
        print(f'First word: {sentence[0]}')
        print(f'Second word: {sentence[1]}')

    elif len(sentence) == 1:
        print('Error no comma.')


while True:
    sentence = input('Please enter your input: ').split(',')
    if sentence == ["q"]:
        break
    else:
        wordPrinter(sentence)

CodePudding user response:

I think the key to understanding your problem may be here:

sentence = input('Please enter your input: ').split(',')

You are storing the user input in a string, but then you are calling the string method str.split(). This method basically returns a list of sub-strings, based on the separator you pass as an argument. If there is no separator, the method will instead create a list whose only element is the original input string.

You can find more information about this method here: https://docs.python.org/3/library/stdtypes.html#str.split.

So, if your input is "q", separator will be storing the array ["q"], as there is no comma. And this array's length is 1, so it will enter the first "elif", and execute the "continue", therefore ending current iteration.

In absence of further information about your project, if you need to do it this way, you can change the order of the last two conditionals and the break conditional itself in order for it to work:

sentence =' '

while True:
    sentence = input('Please enter your input: ').split(',')
    if len(sentence) > 1:
        print('First word: {sentence[0]}')
        print('Second word: {sentence[1]}')
        continue
    elif sentence[0] == 'q':
        break
    elif len(sentence) == 1:
        print('Error no comma.')
        continue

I also changed the while condition, because it was redundant with the "break" statement.

CodePudding user response:

As you splitting the input from very beginning you have to compare string by list element.

Code:

sentence =' '

while True:
    sentence = input('Please enter your input: ').split(',') #['q']
    if len(sentence) > 1:
        print(f'First word: {sentence[0]}')
        print(f'Second word: {sentence[1]}')
        continue
    elif sentence == ['q']: 
        break
    else:
        print('Error no comma.')
        continue

CodePudding user response:

while (sentence := input('Please enter your input: ')) != 'q':
    first, *rest = sentence.split(',')
    if rest:
        print(f'First word: {first}')
        second, *rest = rest
        print(f'Second word: {second}')
        if rest:
            print(f'Rest: {",".join(rest)}')
    else:
        print('Error no comma.')

You can use Python 3.8's walrus operator to assign the input to a variable and also check it's value. I then used iterable unpacking to get the first element of the str.split and the rest as a list. Checking a list itself in a condition tells you if it has any elements in it. I did the same for the second word. Additionally I'm also printing the rest of the words if there are any.

CodePudding user response:

when you use split() you will take list, so sentence cant be str('q')

try like this:

sentence=' '
while True:
    sentence = input().split(',')
    if (len(sentence) == 1)&(sentence[0] == 'q'):
        break
    elif len(sentence)<=1:
        print('error')
    else:
        print(f'First word: {sentence[0]}')
        print(f'Second word: {sentence[1]}')
  • Related