2016-12-17 4 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())) 

или использовать Еогеасп:

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