用于读取输入的StdIn黑客排名挑战

时间:2018-10-14 05:46:40

标签: python python-3.x

使我从Hackerrank挑战中最沮丧的一件事是通过stdin读取功能输入的部分。

Hackerrank输入通常具有\n分隔符,该分隔符通过sys.stdin提供。我想知道一种有效的方式来读取输入并将它们拆分为list。下面是一个示例:

输入:

3 2
1 5 3
3 1
5 7

我想将每一行读到一个单独的list中。以下是我的尝试:

import sys

arr = sys.stdin.readlines()[1].split()
arr = list(map(int, arr))

A = sys.stdin.readlines()[2].split()
A = set(map(int, A))

B = sys.stdin.readlines()[3].split()
B = set(map(int, B))

我遇到以下错误:

A = sys.stdin.readlines()[2].split()

IndexError: list index out of range

为什么IndexError[2]上的[1]有效?是否有更好的方法使用循环读取此类stdin输入?

2 个答案:

答案 0 :(得分:0)

如果需要输入3个列表(知道会有3个列表),则可以尝试以下操作:

myList1 = []
myList2 = []
myList3 = []

inStr1 = input()
inStr2 = input()
inStr3 = input()

for i in inStr1.split(" "):
    myList1.append(int(i))
for i in inStr2.split(" "):
    myList2.append(int(i))
for i in inStr3.split(" "):
    myList3.append(int(i))

这是我得到的样本输出: enter image description here

答案 1 :(得分:0)

出现错误的原因是readlines在第一个呼叫中消耗了所有输入。这意味着您第二次调用它,那里什么也没有。

要制作所有输入的2D列表,您必须使用第一个调用:

data = [line.rstrip().split() for line in sys.stdin.readlines()]

您也可以预先转换为整数:

data = [[int(x) for x in row] for row in data]

现在

arr = data[0]
A = set(data[2])
B = set(data[3])