【问题标题】:Python challenge TypeError: 'int' object is not iterablePython挑战TypeError:'int'对象不可迭代
【发布时间】:2021-10-25 02:17:46
【问题描述】:

这是挑战题之一: 编写一个程序,找出 1000 到 3000 之间的所有数字(都包括在内),使得该数字的每个数字都是偶数。获得的数字应以逗号分隔的顺序打印在一行上。提示:如果向问题提供输入数据,则应假定它是控制台输入。 这是我正在尝试做的事情:如果有输入,则检查所有数字是否为偶数并显示一条消息。如果没有输入,则它将包含所有偶数数字的 1000 到 3000 的数字附加到列表中。我听说嵌套循环是不好的做法,所以欢迎更好的解决方案。 遇到错误: TypeError: 'int' object is not iterable.

num = input("Enter a number to check for even digit. Skip if you want to see 1000-3000: ")
if num:
    list = [int(x) for x in num]
    for i in list:
        if i % 2 != 0:
            x = False
            break
        else:
            x = True
    if x:
        print("It has all even digits!")
    else:
        print("It contains odd digits.")
else:
    t = True
    printl = []
    for i in range(1000,3001):
        l = [str(x) for x in i] # the error line
        for q in l:
            if int(q) % 2 != 0:
                t = False
                break
            else:
                printl.append(q)
    print(printl)

【问题讨论】:

  • l = [x for x in str(i)],您不能迭代 int(而 iint,因此您需要将其转换为可以迭代的字符串)

标签: python


【解决方案1】:

您正在尝试在下面的 for 循环中迭代整数 i:

for i in range(1000,3001):
    l = [str(x) for x in i] # the error line

如果您想遍历该整数的字符串表示,请改用它:

for i in range(1000,3001):
    l = [x for x in str(i)] # the error line

【讨论】:

  • xstr 的转换是多余的
  • 没错,我会编辑的。
  • 谢谢。它确实解决了错误。但我认为我的逻辑是错误的。有更好的主意吗?
  • 为此发布一个新问题
【解决方案2】:

所以你的主要问题(问题)是关于整数在这一行上不可迭代:

for i in range(1000,3001):
    l = [str(x) for x in i] # the error line

所以你试图迭代i,它的类型是int,它不能被迭代,你需要先把它转换成一个字符串,这样:

for i in range(1000,3001):
    l = [x for x in str(i)]

然而,这是非常多余的,因为您可以立即执行此操作:

l = [int(x) for x in str(i)]

并避免稍后转换为int

然而你的逻辑是有缺陷的,在这个循环中,只有最后一个数字是偶数还是不重要:

for i in list:
    if i % 2 != 0:
        x = False
        break
    else:
        x = True

另一个缺陷是在第二个循环中,您将所有偶数附加到该列表中,因此它基本上会创建一个 0、2、4、6、8 的列表,因为您附加了单个数字。您的所有代码都可以简化为(至少):

# create a list to append to
all_even = []
# ask for user input
num = input('Enter a number to check for even digit. Skip if you want to see 1000-3000: ')
# loop over either user input if they did input anything or over the range
# if they didn't input anything
for i in (num and [num]) or range(1000, 3000 + 1):
    # check if all digits in the number are even and
    # if they are append to the list
    if all(int(x) % 2 == 0 for x in str(i)):
        all_even.append(i)

# now check if user did input anything and if they did return the boolean
# of the list `all_even` which if the number had all even digits
# will contain one item so the bool will return True and or returns first True
# value or last one if none are True. So in case user did not input anything go to the
# next logical operator `or` and if there is anything in `all_even` print it out
# lastly print False if there were no values found at all
print(num and bool(all_even) or all_even or False)

来源:

【讨论】:

  • 在'for i in (num and [num])'中,[num]处理什么?
  • @rottenwood 它是一个 for 循环,它需要完整的数字,因此如果使用 num,它将遍历 num 中的每个数字,并比较其中每个数字是否为偶数,与[num] 它是一个列表,所以 i 变量获取它需要的整数,你可以比较 for i in num: print(i)for i in [num]: print(i),如果你的意思是返回值,那么 and 返回第一个假值,如果没有用户输入将是num,但随后or 返回第一个真实值,该值将是范围,如果num 为True,它也会使[num] 为true,因此[num] 将返回到迭代
猜你喜欢
  • 2015-04-06
  • 2013-10-31
  • 2016-02-24
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 2023-01-22
相关资源
最近更新 更多