Python代码自定义输入触发ValueError,但运行时输入正常,请求排查错误
问题排查与解决方案
首先,咱们来拆解一下你遇到的报错根源:
这个ValueError本质是代码在尝试读取边的端点时,拿到了空字符串——核心问题是输入格式和代码的预期不匹配。
为什么手动输入正常,但粘贴整段文本就报错?
你的代码预设的输入格式是这样的:
- 第一行:两个整数,分别是节点数
node和边数edge - 接下来连续
edge行:每行两个整数,表示一条边的两个端点
而你提供的输入是把所有数字(包括node、edge和所有边的端点)都挤在了同一行。这就导致:
- 第一次
input()读取了整行内容,拆分出node=14和edge=12,把这两个数用掉了; - 接下来代码要循环12次读取边的信息,但此时已经没有下一行输入了(所有内容都在第一行读完了),所以
input()返回空字符串,split(" ")后得到[''],用int()转换空字符串自然就触发报错了。
两种解决办法
办法1:按照代码预期的格式输入
把输入内容拆分成多行,符合代码的读取逻辑:
14 12 0 1 0 4 0 2 1 3 1 4 3 5 5 6 5 7 6 8 2 11 11 10 9 13
这样不管是手动输入还是粘贴,代码都能正常运行。
办法2:修改代码兼容整行输入
如果希望输入可以是一整串数字(不用换行),可以修改代码一次性读取所有输入内容,再按顺序处理。同时还要修正原代码的一个小bug:最后打印邻接表时,原代码循环的是range(edge),这会漏掉编号大于边数的节点,应该循环节点编号范围range(node + 1)。修改后的代码如下:
import sys # 一次性读取所有输入的数字,自动忽略换行和空格 all_numbers = list(map(int, sys.stdin.read().split())) index = 0 # 取出节点数和边数 node, edge = all_numbers[index], all_numbers[index + 1] index += 2 adjList = [[] for _ in range(node + 1)] for _ in range(edge): u, v = all_numbers[index], all_numbers[index + 1] index += 2 adjList[u].append(v) adjList[v].append(u) print("Adjacency list unweighted:") # 遍历所有节点打印邻接表 for i in range(node + 1): print(i, " ---> ", end=" ") for neighbor in adjList[i]: print(neighbor, end=" ") print()
内容的提问来源于stack exchange,提问作者Juboraj Roy Pavel
相关产品推荐
相关产品推荐

