¿Por qué obtengo “TypeError: el objeto ‘int’ no es iterable” cuando intento sumar dígitos de un número? [duplicate]

5 minutos de lectura

Aquí está mi código:

import math

print("Hey, lets solve Task 4 :)")

number1 = input("How many digits do you want to look at? ")
number2 = input("What would you like the digits to add up to? ")

if number1 == 1:
    cow = range(0,10)
elif number1 == 2:
    cow = range(10,100)
elif number1 == 3:
    cow = range(100,1000)
elif number1 == 4:
    cow = range(1000,10000)
elif number1 == 5:
    cow = range(10000,100000)
elif number1 == 6:
    cow = range(100000,1000000)
elif number1 == 7:
    cow = range(1000000,10000000)
elif number1 == 8:
    cow = range(10000000,100000000)
elif number1 == 9:
    cow = range(100000000,1000000000)
elif number1 == 10:
    cow = range(1000000000,10000000000)

number3 = cow[-1] + 1

n = 0
while n < number3:
    number4 = list(cow[n])
    n += 1

Estoy buscando hacer un bucle para que cada elemento de la lista se divida en cada uno de sus caracteres. Por ejemplo, diga el número 137 estaba en la lista, entonces se convertiría en [1,3,7]. Luego quiero sumar estos números (todavía no he comenzado, pero tengo una idea de cómo hacerlo).

Sin embargo, sigo recibiendo este mensaje de error:

TypeError: 'int' object is not iterable

¿Qué estoy haciendo mal?

  • Qué esperas list(cow[n]) hacer ?

    –Jon Clements

    22/10/2013 a las 16:39

  • Pista: puedes dar range() argumentos dinámicos también: cow = range(10 ** (number1 - 1) if number1 > 1 else 0, 10 ** number1) le daría exactamente los mismos resultados que todos sus if declaraciones, en una sola línea.

    – Martijn Pieters

    22 de octubre de 2013 a las 16:42


  • @MartijnPieters Estaba pensando en eso, pero piensa en IIRC, 10 ** 0 es 1, no 0

    –Jon Clements

    22 de octubre de 2013 a las 16:43

  • @JonClements: ajustado. 🙂 Eso 0 es bastante inconsistente en este caso; todos los demás números son potencias de 10..

    – Martijn Pieters

    22/10/2013 a las 16:45

Tu problema es con esta línea:

number4 = list(cow[n])

trata de tomar cow[n], que devuelve un número entero, y lo convierte en una lista. Esto no funciona, como se demuestra a continuación:

>>> a = 1
>>> list(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
>>>

Tal vez quisiste poner cow[n] adentro una lista:

number4 = [cow[n]]

Vea una demostración a continuación:

>>> a = 1
>>> [a]
[1]
>>>

Además, quería abordar dos cosas:

  1. A su instrucción while le falta un : al final.
  2. Se considera muy peligroso utilizar input así, ya que evalúa su entrada como código Python real. Sería mejor aquí para usar raw_input y luego convertir la entrada a un número entero con int.

Para dividir los dígitos y luego agregarlos como quieras, primero convertiría el número en una cadena. Entonces, dado que las cadenas son iterables, puede usar sum:

>>> a = 137
>>> a = str(a)
>>> # This way is more common and preferred
>>> sum(int(x) for x in a)
11
>>> # But this also works
>>> sum(map(int, a))
11
>>>

  • Gracias por contestar tan rápido. ¿Cómo dividiría el número en caracteres individuales? Intenté poner una lista (número 4) debajo, pero eso hace que se ejecute para siempre cuando lo ejecuto en la terminal.

    usuario2908001

    22 de octubre de 2013 a las 16:48


  • Los enteros no tienen caracteres. Sin embargo, podría convertirlo en una cadena, lo que hace: str(..). Es posible que no necesite convertirlo en una lista después de eso, dependiendo de lo que pretenda hacer con él, porque las cadenas son iterables y producen sus caracteres constituyentes.

    – tipo todo

    22 de octubre de 2013 a las 16:54


  • @ Mikey6743 – Mira mi edición. Si bien podría usar un bucle for para esto, la opción más rápida es usar sum.

    usuario2555451

    22 de octubre de 2013 a las 16:58


  • Esto es genial chicos, ¡muchas gracias! Acabo de empezar a aprender a codificar 🙂 Todavía estoy confundido sobre cómo repetirlo para que se repita sin usar un bucle. Por ejemplo, digamos que el usuario quiere mirar 3 dígitos, entonces debo calcularlo de 100 a 999. Por ejemplo, la suma de los números enteros en 100 = 1 y la suma de los números enteros en 999 = 27.

    usuario2908001

    22/10/2013 a las 19:28

  • @ Mikey6743 – Hmm, entonces es posible que tengas que usar un bucle. Sin embargo, dado que el tema de esta pregunta era el TypeError (que corrige mi publicación), ¿por qué no cerrar primero esta pregunta como respondida (haga clic en la marca junto a mi respuesta) y luego haga otra pregunta que se centre en ese problema en particular? Obtendrás mejor ayuda de esa manera. Sin embargo, primero debe convertir el número en una cadena para poder dividirlo en dígitos.

    usuario2555451

    22/10/2013 a las 20:07

Avatar de usuario de Agustín José
Agustín José

Si el caso es:

n=int(input())

en lugar de -> for i in n: -> da error- int el objeto no es iterable

Usar -> for i in range(0,n):funciona bien..!

¡Esto es muy simple, está tratando de convertir un número entero en un objeto de lista! por supuesto que fallará y debería…

Para demostrar/probarle esto usando el ejemplo que proporcionó… ¡simplemente use la función de tipo para cada caso como se muestra a continuación y los resultados hablarán por sí mismos!

>>> type(cow)
<class 'range'>
>>> 
>>> type(cow[0])
<class 'int'>
>>> 
>>> type(0)
<class 'int'>
>>> 
>>> >>> list(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
>>> 

avatar de usuario de user16526150
usuario16526150

def hourglassSum(arr):
    sum1 = []
    # Write your code here
    for i in range(0,len(arr)-2):
        for j in range(0,len(arr)-2):
            x = sum(arr[i][j]+arr[i+1][j+1]+arr[i+2][j]+arr[i][j+1]+arr[i][j+2]+arr[i+2][j+1]+arr[i+2][j+2])
            sum1.append(x)
            #sum1.append(arr[i][j]+arr[i][j+1]+arr[i][j+2]+arr[i+1][j+1]+arr[i+2][j]+arr[i+2][j+1]+arr[i+2][j+2])
    return max(sum1)

# Why x = sum(arr[i][j]+arr[i+1][j+1]+arr[i+2][j]+arr[i][j+1]+arr[i][j+2]+arr[i+2][j+1]+arr[i+2][j+2]) is showing TypeError: 'int' object is not iterable

y si ejecutamos la declaración de comentario debajo de la declaración, entonces se ejecuta correctamente.

¿Ha sido útil esta solución?