您好我在这里有一段代码,打算将输入读入变量:
if __name__ == "__main__":
data = list(map(int, sys.stdin.readlines().split()))
n, capacity = data[0:2]
values = data[2:(2 * n + 2):2]
weights = data[3:(2 * n + 2):2]
opt_value = get_optimal_value(capacity, weights, values)
print("{:.10f}".format(opt_value))
然后将执行自定义的get_optimal_value(容量,权重,值)。输入示例:
3 50
60 20
100 50
120 30
应该实现以下目标:
n = 3
capacity = 50
values = [60,100,120]
weights = [20,50,30]
但是,输入上述输入数字后代码没有进行,但没有给出结果。这意味着数字不会被读入变量,而且列表也没有制定。我尝试将代码转换为自动错误检查程序;它告诉我:
AttributeError: 'list' object has no attribute 'split'
为什么会这样,我应该如何修改我的代码?
附加问题:数字读数是否自动知道停止的位置,即何时检测到空格且没有后续数字?我假设代码将执行该函数并在读取所有输入数据后立即计算结果,就进程而言是否正确?我觉得缺乏一个步骤'通知代码'计算'输入后输入。
答案 0 :(得分:0)
readlines
返回list
,其中没有方法split
(它是str
对象的方法,代表单行),因此您的代码是相当于:
l = sys.stdin.readlines() # ["0 1\n", "2 3\n"]
l.split()
如果您希望将split()
应用于每一行,则应添加另一个map
调用我们的使用列表或生成器理解,即
data = list(map(int, map(lambda line: line.split(), sys.stdin.readlines()))
data = list(map(int, line.split() for line in sys.stdin.readlines()))
或者使用foreach:
data = []
for line in sys.stdin:
data.append(map(int, line.split()))
答案 1 :(得分:0)
readlines()
返回字符串列表,split()
仅为字符串定义。如果要将输入作为列表列表返回,每个包含两个整数,则必须应用于列表的元素:
[map(int, x.split(" ")) for x in sys.stdin.readlines().split()]