TypeError:int()参数必须是字符串或数字,而不是'list'
#iterative program to find the highest odd number
m = sorted([a, b, c, d, e, f, g, h, j, k])
n = max(m)
n = int(n)
count = 10
while n%2==0:
m=[m[:-1]]
n = max(m)
n = int(n)
count =-1
if count==0:
print 'There are no odd numbers'
else:
print str(n), 'is the largest odd number'
我输入包含奇数的变量,它给了我正确的答案,但是当我输入所有偶数来满足在'count==0'
条件下,会出现以下错误:TypeError:int()参数必须是字符串或数字,而不是'list'
TypeError: int() argument must be a string or a number, not 'list'
我不明白为什么当有奇数输入不会发生此错误。
如果只有偶数,则当您完全减少m
时,while循环会产生此错误。在这种情况下,max(m)
返回None
,这不能是int
的参数。为了解决这个问题,你需要将你的while循环条件改为更正确的。
然而,这并不是大多数人认为的“pythonic”。理想的情况下为您会用更喜欢for n in m[::-1]
一个循环以相反的顺序穿越m
(或使用sorted
的reverse=True
说法,只是for n in m
)
'max(m)'不为空序列返回'None';它引发了一个'ValueError'。而且,调用'int(None)'显然不会给你一个'TypeError',它引用在'list'上调用'int'。 – abarnert 2013-03-25 21:19:51
如果你打印出什么m
是内循环,这将成为很明显的。或者你可能想用interactive visualizer或只是调试器来测试它。
假设您的值为2, 4, 6, 8, 10, 12, 14, 16, 18, 20
。排序后,你有:
m = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
n = max(m) = 20
n = int(n) = 20
这max
是没用的,因为排序是必须在列表中的最后一个值的定义(你似乎是依靠在你的循环反正) 。
而且int
是一种误导,它使它看起来像你的代码将工作,即使数字是字符串而非数字,但它实际上不会,因为sorted
(和max
)将把'10'
小于'2'
,等等。
但这些都不是你的大问题。因为你的第一个n
甚至,你将进入循环,在循环的第一件事情是这样的:
m=[m[:-1]]
...这将做到这一点:
m = [[2, 4, 6, 8, 10, 12, 14, 16, 18]]
所以,接下来的两行这样做:
n = [2, 4, 6, 8, 10, 12, 14, 16, 18] # the max of a 1-element list is that element
n = int([2, 4, 6, 8, 10, 12, 14, 16, 18])
和繁荣,这是你的例外。
如果您想将m
设置为m
的最后一个元素,请执行m = m[:-1]
。围绕它投掷那些额外的括号将m
设置为由一个元素组成的list
,该元素本身是除m
的最后一个元素之外的所有元素组成的列表。
请注意,尽管你在描述中说了什么,“我输入包含奇数的变量,它给了我正确的答案”,但事实并非如此。它只适用于你的最大值是奇数的情况,所以你从不首先进入循环。
修复此问题后,您的代码实际上仍然中断,但希望现在您知道如何自己调试此代码。
同时,解决这个问题的pythonic方法是尝试将高级英语描述直接转换为高级Python。我们如何找到m
的最高奇数?
首先得到奇数号码m
:
odds = (n for n in m if n % 2)
(如果您创建一个odd
功能,如果你,你可能更喜欢filter
到发电机表达可能是更具可读性。)
然后,以获得最大的:
max_odd = max(odds)
当然,你需要处理在没有胜算的情况。你可以通过检查if odd:
来做到这一点。但蟒蛇,它通常是更好地请求原谅比许可,所以,这里是你的整个程序:与m=[m[::-1]]
发生
m = [a, b, c, d, e, f, g, h, j, k]
odds = (n for n in m if n % 2)
try:
print max(odds), 'is the largest odd number'
except ValueError:
print 'There are no odd numbers'
你的错误,因为@abarnert指出。
这里找到列表中的最大奇数一个简单的方法:
m = sorted([int(n) for n in [a, b, c, d, e, f, g, h, j, k] if n%2==1])
# this makes a list of all ODD integers (converts them from strings)
if len(m) != 0:
print str(max(m)), 'is the largest odd number'
else:
print 'No odd integers inputted'
进一步简化成:
m = sorted([int(n) for n in [a, b, c, d, e, f, g, h, j, k] if n%2==1])
print (str(max(m)), 'is the largest odd number') if len(m)!=0 else 'No odd integers inputted'
为什么你同时使用'sorted'和'max'?为什么要检查'if len(m)!= 0:'而不是更简单,更pythonic'如果m:'(或者,甚至更好,只是'try:')?为什么要打印'str(max(m))'而不是'max(m)',因为这就是'print'已经做的事情?而且,毕竟......这增加了什么,这还不是我的答案? – abarnert 2013-03-25 21:52:37
什么了''的值,'B','C ','d','e','f','g','h','j'和'k'?另外,考虑到你正在排序列表,这个算法似乎不必要的复杂。 – 2013-03-25 21:01:28
尝试在循环中每次打印'm'和'n'的值;它应该可以帮助你看到你的错误在哪里。也就是说,这是一种遍历值列表的非正统方法。 – chepner 2013-03-25 21:10:51