【问题标题】:TypeError: int() argument must be a string or a number, not 'list'TypeError:int() 参数必须是字符串或数字,而不是“列表”
【发布时间】:2013-03-25 20:59:57
【问题描述】:
#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() 参数必须是字符串或数字,而不是“列表”

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

【问题讨论】:

  • abcdefghj的值是多少k?此外,考虑到您正在对列表进行排序,这个算法似乎不必要地复杂。
  • 尝试每次循环打印mn的值;它应该可以帮助您了解错误所在。也就是说,这是一种非常非正统的迭代值列表的方式。

标签: python while-loop iteration typeerror


【解决方案1】:

如果您打印出循环内的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)会处理@ 987654329@小于'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 的最后一个元素以外的所有元素组成的列表。

请注意,尽管您在描述中说“我输入的变量包含奇数,但它给了我正确的答案”,但事实并非如此。它仅在您的最大值为奇数时才有效,因此您一开始就不会进入循环。

在修复此问题后,您的代码实际上仍然存在问题,但希望现在您知道如何自己调试。


同时,解决这个问题的 Python 方法是尝试将您的高级英文描述直接翻译成高级 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'

【讨论】:

    【解决方案2】:

    正如@abarnert 指出的那样,m=[m[::-1]] 出现了您的错误。

    这里有一个简单的方法来查找列表中的最大奇数:

    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'
    

    【讨论】:

    • 你为什么同时使用sortedmax?为什么要检查if len(m) != 0: 而不是更简单、更pythonic 的if m:(或者,甚至更好,只是try:)?为什么要打印str(max(m)) 而不仅仅是max(m),因为print 已经这样做了?毕竟……我的答案中还没有添加什么?
    【解决方案3】:

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

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

    【讨论】:

    • max(m) 不会为空序列返回 None;它引发了ValueError。此外,调用int(None) 显然不会给你一个TypeError,它指的是在list 上调用int
    猜你喜欢
    • 2015-12-03
    • 2015-09-29
    • 2012-03-04
    • 1970-01-01
    • 2018-07-05
    • 2017-11-14
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    相关资源
    最近更新 更多