Python TypeError:int()参数必须是字符串或数字,而不是';列表';
我输入了包含奇数的变量,它给出了正确的答案,但当我输入所有偶数以满足Python TypeError:int()参数必须是字符串或数字,而不是';列表';,python,while-loop,iteration,typeerror,Python,While Loop,Iteration,Typeerror,我输入了包含奇数的变量,它给出了正确的答案,但当我输入所有偶数以满足'count==0'条件时,会出现以下错误: TypeError:int()参数必须是字符串或数字,而不是“列表” 我不明白为什么输入奇数时不会发生此错误 当您只有偶数时,当您将m完全取消填充时,while循环将生成此错误。在这种情况下,max(m)返回None,它不能作为int的参数。要解决这个问题,您需要将while循环条件更改为更正确的条件 然而,这并不是大多数人认为的“Pythic”。理想情况下,您可以使用一个更像的循环
'count==0'
条件时,会出现以下错误:
TypeError:int()参数必须是字符串或数字,而不是“列表”
我不明白为什么输入奇数时不会发生此错误 当您只有偶数时,当您将
m
完全取消填充时,while循环将生成此错误。在这种情况下,max(m)
返回None
,它不能作为int
的参数。要解决这个问题,您需要将while循环条件更改为更正确的条件
然而,这并不是大多数人认为的“Pythic”。理想情况下,您可以使用一个更像
的循环来表示m中的n[::-1]
,它以相反的顺序遍历m
(或者使用sorted
的reverse=True
参数,并且只对m中的n使用)如果您打印出m
在循环中的内容,这一点就变得非常明显。或者您可能希望使用一个或仅使用调试器来测试它
假设您的值是2,4,6,8,10,12,14,16,18,20
。排序后,您将得到:
#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'
这个max
是无用的,因为根据排序的定义,is必须是列表中的最后一个值(而且您似乎仍然依赖于循环中的值)
而int
具有误导性,它使代码看起来可以工作,即使数字是字符串而不是数字,但实际上不会,因为排序的(和max
)将'10'
视为小于'2'
,依此类推
但这两个都不是你的大问题。因为你的第一个n
是偶数,你将进入循环,循环中的第一件事是:
m = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
n = max(m) = 20
n = int(n) = 20
…这将实现:
m=[m[:-1]]
接下来的两行是这样做的:
m = [[2, 4, 6, 8, 10, 12, 14, 16, 18]]
砰,这是你的例外
如果要将m
设置为除m
的最后一个元素之外的所有元素,只需执行m=m[:-1]
。将这些额外的括号括起来,将m
设置为一个列表
,该列表由一个元素组成,该元素本身就是由m
的最后一个元素以外的所有元素组成的列表
请注意,尽管您在描述中说,“我输入包含奇数的变量,它会给我正确的答案”,但事实并非如此。它只在最大值为奇数时才起作用,因此您永远不会首先进入循环
在修复此问题后,您的代码实际上仍处于中断状态,但希望您现在知道如何自己调试此问题
同时,解决这个问题的Python方法是尝试将您的高级英语描述直接翻译成高级Python。如何在m
中找到最高奇数
首先获取m
中的奇数:
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])
(如果创建一个odd
函数,则可读性可能更高;如果创建,则可能更喜欢filter
而不是生成器表达式。)
然后,要获得最大值:
odds = (n for n in m if n % 2)
当然,你需要处理没有胜算的情况。您可以通过选中(如果为奇数):
来完成此操作。但在python中,请求原谅通常比请求允许要好,因此,以下是您的整个程序:
max_odd = max(odds)
正如@abarnert所指出的,您的错误发生在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'
进一步简化为:
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'
a
,b
,c
,d
,e
,f
,g
,h
,j
和k
的值是什么?此外,考虑到您正在对列表进行即时排序,此算法似乎不必要地复杂。请尝试通过循环每次打印m
和n
的值;它应该能帮助你看清错误所在。这就是说,这是一种非常非正统的迭代值列表的方法。max(m)
对于空序列不返回None
;它会引发一个ValueError
。另外,调用int(None)
显然不会给您一个类型错误
,它指的是调用列表上的int
。您为什么同时使用排序
和max
?如果len(m)!=0:
而不是更简单、更通俗的,如果m:
(或者,更好的是,只要试试:
)?为什么打印str(max(m))
而不是只打印max(m)
,因为这是print
已经做过的事情?在这一切之后…我的答案中没有的补充是什么?
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'