Why does standard input() cause an EOF error

2019-09-15 16:16发布

I was solving a problem on HackerRank when I encountered the following problem in my code. I tested it out on my Python (2.7.10) IDLE , and it was working fine. But it showed the following error on HackerRank:

Traceback (most recent call last):
  File "solution.py", line 13, in <module>
    input_2=input()
EOFError: EOF when reading a line

I entered the following code:

import sys 
input_2=""
n=int(input())
m=0
l=0
array=[]
main_array=[]
for i in range (0,n):
    inp=input()
    array=(inp.split(" "))
    main_array+=array   
for no in range(0,100000,1):    
    input_2=input()
    for m in range(0,len(main_array),2):
        l=0
        if input_2==main_array[m]:
            l+=1
            print (main_array[m]+"="+main_array[m+1])
    if l==0:
        print ("Not found")

I don't know why this error turned up in the HackerRank Engine. Thanks

2条回答
我只想做你的唯一
2楼-- · 2019-09-15 16:39

I encountered similar EOF issues when I coded in HackerRank. Actually, there are 2 issues:

  1. use input() in Python3 and raw_input() in Python2.
  2. If you know the exact number of input, you can N-number for-loop to handle each input(). However, the difficulty is that you don't know how many inputs you will have. In this case, you will have to use sys.stdin.readlines() to convert them into a list, and then use a for-each loop.

The following codes are from "Editorial" of https://www.hackerrank.com/challenges/30-dictionaries-and-maps/

import sys 

# Read input and assemble Phone Book
n = int(input())
phoneBook = {}
for i in range(n):
    contact = input().split(' ')
    phoneBook[contact[0]] = contact[1]

# Process Queries
lines = sys.stdin.readlines()  # convert lines to list
for i in lines:
    name = i.strip()
    if name in phoneBook:
        print(name + '=' + str( phoneBook[name] ))
    else:
        print('Not found')
查看更多
Summer. ? 凉城
3楼-- · 2019-09-15 16:45

I don't know what are you exactly trying to achieve through your code, but you are getting an error due to the line inp=input(), which tries to take a string as input, whereas it's designed to take an int, float, or string entered with quotes in python 2.7. Use raw_input() instead to take the complete line as string input, and then split it with space as delimiter.

I followed the link you provided, and I see that the given question needs to be solved using dictionaries. Hence, instead of appending the name and number, just store it in dictionary as a key-value pair and for each query, just check whether the key exists in the dictionary or not. If not, print Not found, else print the key and its corresponding value. Here is the code for reference :

import sys
input_2=""
n = input()
m=0
l=0
array=[]
main_array={}
for i in range (0,n):
    inp=raw_input()
    array=(inp.split())
    main_array[array[0]] = array[1]
for i in range(0,n):
    take = raw_input()
    if take in main_array :
        print take+"="+main_array[take]
    else :
        print "Not found"

Hope this helps !

查看更多
登录 后发表回答