Learner23
Learner23

Reputation: 137

Error in input: Python

I have an input with newline between each string. The end will be noted by a number between 1 to 5:

Input: Ha

Ha

Hee

Hee

Ho

5

I need to accept this as list of strings in python where my list would contain: ['Ha', 'Ha', 'Hee', 'Hee', 'Ho']

After a lot of googling, I tried the following code:

lines = []

sentinel = range(6)

for i in iter(raw_input, [str(s) for s in sentinel]):
    if i=='':
        continue
    else:
        lines.append(i)

print lines

I don't know why but it goes into an infinite loop.

Please help me out!

Upvotes: 1

Views: 102

Answers (2)

FatalError
FatalError

Reputation: 54551

The issue is with the way iter() interpets the sentinel. It's a single value that indicates the end of iteration. For your sentinel to be hit, raw_input() would actually have to return an identical list, which can never happen (since of course it returns a str).

If you wrap things up a bit, you can make it work:

sentinel = range(6)

def anything_but(values):
    values = map(str, values)
    def inner():
        i = raw_input()
        if i in values:
            return None
        return i
    return inner

lines = []
for i in iter(anything_but(sentinel), None):
    lines.append(i)

print lines

In this case, None is the sentinel value which will be returned if a number 0-5 is entered. As an aside, if you wanted 1-5 as you mentioned you should use range(1, 6) instead.

However, you're probably better served doing it with a generator:

sentinel = range(6)

def anything_but(values):
    values = map(str, values)
    i = raw_input()
    while i not in values:
        yield i
        i = raw_input()

lines = []
for i in anything_but(sentinel):
    lines.append(i)

print lines

Upvotes: 1

Padraic Cunningham
Padraic Cunningham

Reputation: 180411

You can just use a while loop:

inp = raw_input()
while inp not in {"1","2","3","4","5"}:
    if not inp:
       continue
    else:
        lines.append(inp)
    inp = raw_input()
print lines

Using the inputs in your question outputs:

['Ha', 'Ha', 'Hee', 'Hee', 'Ho']

Upvotes: 0

Related Questions