使我从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
输入?
答案 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))
答案 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])