2014-09-03 3 views
-3

Почему я получаю сообщение об ошибке с помощью функции map() в следующем коде? Почему нельзя преобразовать отрицательные числа в список x. Выход должен быть как «1 -> 2 -> 3». Список должен заканчиваться при вводе -999. Я получаю сообщение об ошибке, таких как:Python map() function

Traceback (most recent call last): 
    File "c2.py", line 3, in <module> 
    x=map(int,x) 
ValueError: invalid literal for int() with base 10: '-' 

Код:

while(1): 
    x=list(raw_input("Input a number\n(type -999 to end);")) 
    x=map(int,x) 
    if x<0: 
     break 
    pass 
    print x 
del x[len(x)] 
for i in range(0,(len(x))): 
    print "%d-->" %(x[i]), 
+0

'Int (х)' действительно преобразует 'x' к целому числу, не требуется «карта»; но не если 'x' - это список. Поэтому вы также должны удалить вызов «list» во второй строке. – Kevin

+1

Какой формат должен принимать вход? '" 1 2 3 4 -999 "' на одной строке или на отдельные входы? Обратите внимание, что 'list (" - 999 ") == ['-', '9', '9', '9']'. – jonrsharpe

+0

Так как 'raw_input' возвращает строку,' list (raw_input (...)) 'переломит эту строку в список, содержащий символы исходной строки. – chepner

ответ

0

Попробуйте

x = map(int,raw_input().split()) 
+0

Итак, теперь x будет списком целых чисел, который по крайней мере избавится от OP 'ValueError'. Но тогда он войдет в бесконечный цикл, потому что 'x <0' всегда будет оценивать значение' False'. Или он получит 'TypeError: unorderable types: list() Kevin

+0

Yep, решил только часть проблемы. Lazy me = D – Inox

0

Не обращаясь к другим ошибкам, не связанным с карты, проблема в том, что карты возвращает список.

Проверьте это в IDLE:

>>> map(int, ["123", "456", 7.3]) 
[123, 456, 7] 
>>> 

Так x<0 не имеет смысла, вы хотели бы что-то вроде мин (х) < 0. Что-то, что принимает список в качестве входных данных.

Это случай, когда вы, вероятно, должны изолировать и обрабатывать каждую запись отдельно. Получите строку ввода, просмотрите ее для пробелов (или split(), как указано ниже) и проанализируйте каждое целое число.

Даже если вы правильно использовали раскол и карту, вы автоматически будете обрабатывать целые числа в одной строке с -999, но после этого. И все, что не анализирует, не даст вам достаточно отзывов, чтобы узнать, что действительно пошло не так.

Разбор пользовательского ввода часто должен быть низкоуровневым и ориентированным на характер, или он не может диагностировать их неправильную запись. Иногда жизнь утомительна.

(Кроме того, почему пустой список, а затем попытаться напечатать?)

1

спасибо ... получил его :)

x=[] 
    while(1): 
     s=raw_input("Input a number\n(type -999 to end);") 
     s=int(s) 
     x.append(s) 
     if s<0: 
      break 
     pass 
    print "\n%d" %(x[0]), 
    for i in range(1,(len(x))): 
     print "-->%d" %(x[i]), 
    print "\n\nNumber of items = %d" %(len(x)-1) 
+0

Не отвечайте себе, в будущем, отредактируйте что-то подобное в оригинальном посте под баром или что-то в этом роде. В противном случае люди будут продолжать отвечать на ваш вопрос. –

+0

@JonJayObermark см. Http://meta.stackexchange.com/a/216722/248731 - ответы должны быть ответами, и, если другие пользователи подумают, что они могут улучшить дальнейшие действия OP, их можно попробовать. – jonrsharpe

+0

Извините. Это странный этикет, но я думаю, что это местное правило. (Я вижу, что я предлагаю делать здесь все время, и я лично ценю это.) Если это ответ, по крайней мере, должен быть отредактирован вопрос, как сказано, поскольку ответ не имеет ничего общего с актуальные вопросы в OP, или заголовок. –