2014-09-03 158 views
-3

为什么我在下面的代码中使用map()函数发生错误?为什么不能在名单x中映射转换负数。输出应该像“1 - > 2 - > 3”。只要我输入-999,该列表就应该结束。我得到一个错误,如:Python map()函数

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'到一个整数,不需要'map';但如果'x'是一个列表则不会。所以你也应该删除第二行的'list'调用。 – Kevin 2014-09-03 12:52:11

+1

输入格式应采用何种格式? ''1 2 3 4 -999“'在一条线上,还是单独的输入?注意'list(“ - 999”)== [' - ','9','9','9']'。 – jonrsharpe 2014-09-03 12:52:59

+0

由于'raw_input'返回一个字符串,'list(raw_input(...))'会将该字符串分解为包含原始字符串的字符的列表。 – chepner 2014-09-03 12:58:08

回答

0

尝试

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

好吧,现在x将是一个整数列表,它至少摆脱了OP的'ValueError'。但是他会进入一个无限循环,因为'x <0'总会被评估为'假'。或者他会得到'TypeError:unorderable types:list() Kevin 2014-09-03 12:59:05

+0

是的,只解决了部分问题。懒惰的我= D – Inox 2014-09-03 13:14:00

0

没有解决无关的其他虫子地图,问题是,地图返回一个列表。

检查它在IDLE:

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

所以x<0是没有意义的,你会想是这样分钟(X)< 0一些需要列表作为输入。

这种情况下,您应该分别隔离并处理每个条目。获取输入行,扫描它的空格(或分割(),如下所述)并分析每个整数。

即使您正确使用了拆分和映射,您也会自动将同一行上的整数与-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

不要回答自己,在未来,编辑这样的东西到原来的文章下的酒吧或什么的。否则,人们将继续回答你的问题。 – 2014-09-03 13:13:40

+0

@JonJayObermark请参阅http://meta.stackexchange.com/a/216722/248731 - 答案应该是答案,如果其他用户认为可以在OP上进一步改进,欢迎尝试。 – jonrsharpe 2014-09-03 13:16:36

+0

对不起。这是奇怪的礼节,但我想这是当地的规则。 (我确实看到了我一直在这里做的事情,而且我个人很欣赏它)。如果这是答案,至少所述的问题需要编辑,因为答案与OP中的实际问题或标题。 – 2014-09-03 15:08:53