不确定为什么Python readlines()在这里不起作用

时间:2016-12-17 09:49:01

标签: python-2.7 readline

您好我在这里有一段代码,打算将输入读入变量:

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'

为什么会这样,我应该如何修改我的代码?

附加问题:数字读数是否自动知道停止的位置,即何时检测到空格且没有后续数字?我假设代码将执行该函数并在读取所有输入数据后立即计算结果,就进程而言是否正确?我觉得缺乏一个步骤'通知代码'计算'输入后输入。

2 个答案:

答案 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()]