【问题标题】:Stdin issues using Python使用 Python 的标准输入问题
【发布时间】:2014-09-30 11:49:49
【问题描述】:

我最近第一次参加黑客马拉松,却被第一个问题卡住了。我解决了算法,但无法弄清楚如何使用 Python 从标准输入中获取值。这是一个问题:

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

输入:第一行输入一个数字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

如何正确接受来自标准输入的数据?

【问题讨论】:

  • 我喜欢使用 sys.stdin.readline() 或“for line in sys.stdin:”。然后你可以“line.split()”并转换为 int 或其他。 input() 在 CPython 2.x 中工作,但它有点不安全。在 3.x 中,我相信 input() 很好。在 2.x 中,您必须使用 raw_input() 并记住不要使用 input()。但我还是更喜欢使用 sys.stdin。

标签: python stdin


【解决方案1】:

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

inputln = raw_input().split()

这将输入行作为字符串,split() 方法将字符串以空格作为分隔符并返回一个 list 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

希望这会有所帮助,如果需要,请删除 cmets 以进行澄清。

【讨论】:

  • 那么,raw_input() 将与标准输入一起使用吗?我必须将我的答案提交给黑客马拉松网站,他们将在那里测试代码。没有人可以在命令行输入数字。只是想确定一下,因为我已经提交了 4 次 wong 解决方案,而且它开始变得尴尬了!
  • 是的,raw_input() 将适用于标准输入。通常黑客马拉松或在线评委中的测试用例将是具有一系列测试用例的输入文件。上面的代码应该可以工作。
  • 我遵循了您的解释,并且在黑客马拉松网站上正确提交了代码。非常感谢!
猜你喜欢
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
相关资源
最近更新 更多