2016-12-17 59 views
-1

您好我有一個代碼塊在這裏,打算讀的輸入變量:不知道爲什麼Python的readlines方法()不在這裏工作了

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

'readlines方法()'返回一個字符串列表(每行一個字符串)。你可以將它改爲'read()',它將整個文件讀入一個字符串,然後可以用split()分割。 – Meyer

回答

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())) 
0

readlines()返回字符串列表,split()僅針對字符串定義。如果你想返回輸入的列表,每個兩個整數的列表,你必須向列表中的元素:

[map(int, x.split(" ")) for x in sys.stdin.readlines().split()] 
相關問題