#python #arrays #integer #valueerror
Вопрос:
Я пытаюсь решить упражнение по кодовым войнам:
Учитывая массив целых чисел любой длины, верните массив, в котором к значению, представленному массивом, добавляется 1.
- массив не может быть пустым
- допускаются только неотрицательные целые числа с одной цифрой
Возвращайте ноль (или эквивалент вашего языка) для недопустимых входных данных. Примеры
Например, массив [2, 3, 9] равен 239, добавление одного вернет массив [2, 4, 0].
[4, 3, 2, 5] вернется [4, 3, 2, 6]
test.assert_equals(up_array([2,3,9]), [2,4,0]) test.assert_equals(up_array([4,3,2,5]), [4,3,2,6]) test.assert_equals(up_array([1,-9]), Нет)
и я написал код:
def up_array(arr):
print(arr)
strings = ''
for integer in arr:
if integer < 0 or integer >= 10:
return None
else:
strings = str(integer)
a_string = "".join(strings)
ints = int(a_string) 1
to_string = str(ints)
return [int(x) for x in to_string]
Он прошел все тесты, но выдает ошибку:
Traceback (most recent call last):
File "tests.py", line 15, in <module>
test.assert_equals(up_array([]), None);
File "/workspace/default/solution.py", line 11, in up_array
ints = int(a_string) 1
ValueError: invalid literal for int() with base 10: ''
Я не понимаю, почему код вызывает эту ошибку. Спасибо
Комментарии:
1. Почему вы устанавливаете
a_string = "".join(strings)
вместо того, чтобы просто использоватьstrings
?2. Попробуйте отследить, что произойдет, если вы передадите пустой список
up_array
кому .3. Вы слишком часто конвертируете между строками и входами
Ответ №1:
Исключение, о котором вы сообщаете, имеет смысл, только если arr
оно пустое. Это «недопустимый» ввод, но это не значит, что он вам не будет предоставлен, только то, что от вас не ожидается нормального ответа (вам нужно вернуться None
).
Я предлагаю добавить проверку в верхней части вашей функции:
if not arr: # empty list
return None
Ответ №2:
Попробуйте это:
def up_array(arr):
num = 1 int(''.join(str(ele) for ele in arr))
return [int(i) for i in str(num)]
print(up_array([2, 3, 9]))
ВОЗВРАТ [2, 4, 0]
.
Вы также можете добавить оператор if из ответа Blcknight в начале, если хотите.
Комментарии:
1. Если вам нужно пройти тесты, основанные на целых числах нашего диапазона во входных данных (возвращающихся
None
вместо создания исключения), вам также потребуется проверить их.2. @Blckknight если вы можете контролировать ввод, это не абсолютно необходимо, но на моем месте я бы все равно сделал это. Я просто не включил это в свой ответ, главным образом потому, что меня это не беспокоило.
3. Конечно, но если бы вы могли контролировать ввод, у вас не возникло бы проблемы, о которой спрашивал спрашивающий. Правильная обработка неверных входных данных была всей проблемой здесь, больше ничего плохого в остальной части их кода нет, даже если он менее лаконичен, чем ваш.
4. @Blckknight Я забыл о том, в чем была проблема :П. Ну, он принял ваш ответ, так что ничего страшного. Спасибо, что держишь меня в курсе ;).