2
#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() 参数必须是字符串或数字,而不是“列表”

我不明白为什么输入奇数时不会发生此错误。

4

3 回答 3

3

如果您打印出m循环内的内容,这将变得非常明显。或者您可能想使用交互式可视化器或仅使用调试器对其进行测试。

假设您的价值观是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(and 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:。但是在 python 中,请求宽恕通常比请求许可更好,所以,这是你的整个程序:

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'
于 2013-03-25T21:22:13.593 回答
0

m=[m[::-1]]正如@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'
于 2013-03-25T21:41:14.697 回答
-3

当您只有偶数时,您的 while 循环会在您m完全取消填充时生成此错误。在这种情况下max(m)返回None,它不能是 的参数int。要解决此问题,您需要将 while 循环条件更改为更正确的内容。

然而,这并不是大多数人认为的“pythonic”。理想情况下,您将使用更像以相反顺序for n in m[::-1]遍历的循环(或使用and的参数。)mreverse=Truesortedfor n in m

于 2013-03-25T21:15:41.570 回答