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'