Из цикла while в ValueError - PullRequest
       1

Из цикла while в ValueError

0 голосов
/ 26 февраля 2019

Я хочу целочисленный ввод для переменной x, через пробел. Пример ввода пользователя 20 15 7 5 4 2.Этот список должен быть введен в x, а затем разделен на две части.Затем части должны быть вычтены друг с другом и вывести наименьшую возможную разницу.Приведенный ниже код разбивает входные данные уже частично на списки, но не завершает их.Я подумал, что либо создам цикл while, инкапсулируя все операторы if, но, тем не менее, выдает следующую ошибку:

Сообщение об ошибке

Traceback (most recent call last):   
File "C:/Users/Array Partitioning.py", line 28, in <module>
    arrpartitioning(input().split())   
File "C:/Users/Array Partitioning.py", line 18, in arrpartitioning
    b.append(max(x)) 
ValueError: max() arg is an empty sequence

Я предполагаю, что оператор whileне останавливается и пытается через некоторое время перебрать пустой список переменной x.Первоначально я думал проверить длину переменной x перед повторным запуском цикла while, но это не работает.Оператор if во втором цикле while также не помогает, даже если я сделаю отступ, чтобы включить его в цикл while.

# User input, space separated
ui = input()
x = list(map(int, ui)    
half = sum(x)//2

# two empty lists to enter the x-values
a = []
b = []
flag = False
# while len(x) != 0:
# while loop to divide the values
while flag == False:
    if sum(a) < half:
        a.append(max(x))
        x.remove(max(x))
        while sum(b) < sum(a):
            b.append(max(x))
            x.remove(max(x))
        # Same error message even if I indent the if-statement to the while-block
        if len(x) == 0:
            flag == True

Может кто-нибудь сначала объяснить мне, есть ли проблема в моем цикле while и, если да, во-вторых, как я могу выйти из цикла while, если в x больше нет значений

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

вам нужно добавить условие, чтобы оно выходило из цикла, когда x больше не действителен:

# User input, space separated
ui = input()
x = list(map(int, ui.split(' ')))
half = sum(x)//2

# two empty lists to enter the x-values
a = []
b = []

# while len(x) != 0:
# while loop to divide the values
while len(x) > 1:
    if sum(a) < half:
        a.append(max(x))
        x.remove(max(x))
        while sum(b) < sum(a):
            b.append(max(x))
            x.remove(max(x))

# check last element independently
if sum(b) < sum(a) < half:
    b.append(x.pop())
else:
    a.append(x.pop()) 

print(x)
print(a)
print(b)
0 голосов
/ 26 февраля 2019

Вам необходимо разделить пользовательский ввод на отдельные строки перед отображением int на него.В противном случае он пытается преобразовать целую строку 20 15 7 5 4 2 в одно целочисленное значение.Чтобы исправить это, попробуйте добавить split() к входу карты, чтобы преобразовать его в список строк:

x = list(map(int, ui.split())

РЕДАКТИРОВАТЬ: я в основном указывал на проблему, которая вызвала ошибку, но большую проблемувероятно, бесконечный цикл, как упомянуто выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...