使用Python的Stdin问题

问题描述:

我最近第一次参加了黑客马拉松,并陷入了第一个问题。我解决了算法,但无法弄清楚如何使用Python从stdin中获取值。这是一个问题:使用Python的Stdin问题

有两个大学生想在宿舍里聚在一起。宿舍里有各种大小的房间。有些房间可以容纳两个额外的学生,而另一些则不能。

输入:第一个输入行将是一个数字n(1≤n≤100),它是宿舍中的房间总数。之后会有n行,其中每行包含两个数字,p和q(0≤p≤q≤100)。 P是已经在房间里的学生人数,而q是可以住在房间里的最多学生人数。

输出:打印室,两个学生可以住在数量

这是我的解决方案。我使用raw_input()测试了它,它在我的解释器上完美工作,但是当我将其更改为input()时,我收到一条错误消息。

def calcRooms(p, q): 
    availrooms = 0 
    if q - p >= 2: 
     availrooms += 1 
    return availrooms 

def main(): 
    totalrooms = 0 
    input_list = [] 

    n = int(input()) 
    print n 

    while n > 0: 
     inputln = input().split() #accepts 2 numbers from each line separated by whitespace. 
     p = int(inputln[0]) 
     q = int(inputln[1]) 
     totalrooms += calcRooms(p, q) 
     n -= 1 

    return totalrooms 

print main() 

错误消息:

SyntaxError: unexpected EOF while parsing 

如何接受正确地从标准输入数据?

+1

[raw_input](https://docs.python.org/2/library/functions.html#raw_input) – DOOM 2014-09-27 19:06:15

+1

我喜欢使用sys.stdin.readline()或“for sys.stdin中的行:”。然后你可以“line.split()”并转换为int或其他。 input()在CPython 2.x中工作,但它是不安全的。在3.x中,我相信input()很好。在2.x中,你必须使用raw_input()并记住不要使用input()。但我仍然喜欢使用sys.stdin。 – user1277476 2014-09-27 19:12:01

在这种特殊情况下,使用raw_input将整行作为字符串输入。

inputln = raw_input().split()

这需要输入线作为字符串和split()方法与空间分割字符串作为分隔符,并返回一个列表inputln

下面的代码工作,你想要的方式。

def main(): 
    totalrooms = 0 
    input_list = [] 
    #n = int(input("Enter the number of rooms: ")) 
    n = input() 

    while n > 0: # You can use for i in range(n) : 
     inputln = raw_input().split() #Converts the string into list 

     p = int(inputln[0]) #Access first element of list and convert to int 
     q = int(inputln[1]) #Second element 

     totalrooms += calcRooms(p, q) 
     n -= 1 

    return totalrooms 

或者,您也可以使用fileinput

如果输入文件未作为命令行参数传递,则stdin将作为默认输入流。

import fileinput 
for line in fileinput.input() : 
     #do whatever with line : split() or convert to int etc 

请参考:docs.python.org/library/fileinput.html

希望这会有所帮助,如果需要的话落评论作出澄清。

+0

那么,raw_input()将与标准输入一起使用?我必须将我的答案提交给他们将在其中测试代码的黑客马拉松网站。没有人在命令行输入数字。只是想确定一下,因为我已经提交了4次wong解决方案,并且开始变得尴尬! – MNRC 2014-09-28 02:51:08

+0

是的,raw_input()将与标准输入配合使用。通常,黑客马拉松或在线评判中的测试用例都是具有一系列测试用例的输入文件。上面的代码应该可以工作。 – venki421 2014-09-28 06:37:47

+0

我遵循你的解释,代码在黑客马拉松网站上正确提交。非常感谢! – MNRC 2014-09-28 18:09:47