Búsqueda de sitios web

[Resuelto] TypeError: ¿Los índices de lista deben ser números enteros o sectores, no 'Str'?


◈ Descripción general

Objetivo: ¿Cómo solucionar - TypeError: los índices de lista deben ser enteros o sectores, no str en Python?

Ejemplo: Eche un vistazo al siguiente código que genera el error mencionado anteriormente.

list1 = ['Mathematics','Physics', 'Computer Science']
index = '1'
print('Second Subject: ', list1[index])

Salida:

Traceback (most recent call last):
File “D:/PycharmProjects/pythonProject1/error.py”, line 3, in
print(‘Second Subject: ‘, list1[index])
TypeError: list indices must be integers or slices, not str

Razón:

¡Encontramos el TypeError porque intentamos acceder al índice de la lista usando una cadena que no es posible!

Antes de continuar, echemos un vistazo rápido a la solución al error anterior.

Solución:

Debes usar un número entero para acceder a un elemento usando su índice.

list1 = ['Mathematics','Physics', 'Computer Science']
index = 1
print('Second Subject: ', list1[index])

# Output:-
# First Subject:  Physics

Pero esto nos lleva a una serie de preguntas. Veámoslos uno por uno.

◈ ¿Qué es TypeError en Python?

Generalmente se genera un TypeError cuando se aplica una determinada operación a un objeto de un tipo incorrecto.

Ejemplo:

print('Java'+2+'Blog')

Salida:

TypeError: can only concatenate str (not “int”) to str

En el código anterior, intentamos agregar un objeto de cadena y un objeto entero usando el operador +. Esto no está permitido; por lo tanto, encontramos un TypeError.

Puede haber numerosos motivos que provoquen la aparición de TypeError. Algunas de estas razones son:

  • Intentando realizar una operación no compatible entre dos tipos de objetos.
  • Intentando llamar a una persona a la que no se puede llamar.
  • Intentando iterar sobre un identificador no iterativo.

◈ Razón detrás: TypeError: los índices de lista deben ser enteros o sectores, no 'Str'

Python genera TypeError: los índices de lista deben ser enteros o sectores, no 'Str' cada vez que intenta acceder a un valor o un índice de una lista usando una cadena.

Echemos un vistazo a otro ejemplo complejo en el que puede encontrar este tipo de TypeError.

◈ Ejemplo: intentar acceder a un valor de una lista de diccionarios utilizando una cadena

Problema: Dada una lista de diccionarios; Cada diccionario de la lista contiene el nombre de un atleta y los deportes con los que está asociado. Tienes que ayudar al usuario con los deportes cuando el usuario ingresa el nombre del atleta.

Su código:

athletes = [
        {
            'name': "Mike Tyson",
            'sports': "Boxing"
        },
        {
            'name': "Pele",
            'sports': "Football"
        },
        {
            'name': "Sachin Tendulkar",
            'sports': "Cricket"
        },
        {
            'name': "Michael Phelps",
            'sports': "Swimming"
        },
        {
            'name': "Roger Federer",
            'sports': "Tennis"
        }
]
search = input('Enter the name of the athlete to find his sport: ')
for n in range(len(athletes)):
    if search.lower() in athletes['Name'].lower():
        print('Name: ',athletes['Name'])
        print('Sports: ', athletes['Name'])
        break
else:
    print('Invalid Entry!')

Salida:

Traceback (most recent call last):
File “D:/PycharmProjects/pythonProject1/TypeError part2.py”, line 25, in
if search.lower() in athletes[‘Name’].lower():
TypeError: list indices must be integers or slices, not str

Explicación: El error anterior ocurrió porque intentó acceder a Nombre usando la clave. La estructura de datos completa en este ejemplo es una lista que contiene diccionarios y no puede acceder al valor dentro de un diccionario particular de la lista usando su clave.

Solución 1: acceder al índice usando range() + len()

Para evitar TypeError: los índices de la lista deben ser números enteros o sectores, no str en el ejemplo anterior, primero debe acceder al diccionario usando su índice dentro de la lista que contiene el valor de búsqueda y luego acceda al valor usando su key.

athletes = [
        {
            'name': "Mike Tyson",
            'sports': "Boxing"
        },
        {
            'name': "Pele",
            'sports': "Football"
        },
        {
            'name': "Sachin Tendulkar",
            'sports': "Cricket"
        },
        {
            'name': "Michael Phelps",
            'sports': "Swimming"
        },
        {
            'name': "Roger Federer",
            'sports': "Tennis"
        }
]
search = input('Enter the name of the athlete to find his sport: ')
for n in range(len(athletes)):
    if search.lower() in athletes[n]['name'].lower():
        print('Name: ',athletes[n]['name'])
        print('Sports: ', athletes[n]['sports'])
        break
else:
    print('Invalid Entry!')

Salida:

Enter the name of the athlete to find his sport: Sachin
Name:  Sachin Tendulkar
Sports:  Cricket

Explicación:

  • En lugar de iterar directamente sobre la lista, debe iterar a través de cada diccionario uno por uno dentro de la lista usando los métodos len() y range().
  • Puede acceder a un valor particular desde un diccionario particular usando la siguiente sintaxis:

      list_name[index_of_dictionary]['Key_within_dictionary']
    • ejemplo:- atletas[n]['nombre']

Solución 2: acceder al índice usando enumerate()

Puede acceder al índice de un diccionario dentro de la lista utilizando el método enumerate integrado de Python como se muestra a continuación.

athletes = [
        {
            'name': "Mike Tyson",
            'sports': "Boxing"
        },
        {
            'name': "Pele",
            'sports': "Football"
        },
        {
            'name': "Sachin Tendulkar",
            'sports': "Cricket"
        },
        {
            'name': "Michael Phelps",
            'sports': "Swimming"
        },
        {
            'name': "Roger Federer",
            'sports': "Tennis"
        }
]
search = input('Enter the name of the athlete to find his sport: ')
for n,name in enumerate(athletes):
    if search.lower() in athletes[n]['name'].lower():
        print('Name: ',athletes[n]['name'])
        print('Sports: ', athletes[n]['sports'])
        break
else:
    print('Invalid Entry!')

Salida:

Enter the name of the athlete to find his sport: Tyson
Name:  Mike Tyson
Sports:  Boxing

Solución 3: Python One-Liner

Aunque esta puede no ser la solución más simple o incluso la forma más Python de resolver el problema, merece ser mencionada porque es un gran truco para derivar su solución en una sola línea de código.

athletes = [
        {
            'name': "Mike Tyson",
            'sports': "Boxing"
        },
        {
            'name': "Pele",
            'sports': "Football"
        },
        {
            'name': "Sachin Tendulkar",
            'sports': "Cricket"
        },
        {
            'name': "Michael Phelps",
            'sports': "Swimming"
        },
        {
            'name': "Roger Federer",
            'sports': "Tennis"
        }
]

search = input('Enter the name of the athlete to find his sport: ')
print(next((item for item in athletes if search.lower() in item["name"].lower()), 'Invalid Entry!'))

Soluciones:

Enter the name of the athlete to find his sport: Roger
{'name': 'Roger Federer', 'sports': 'Tennis'}

◈ Un ejemplo sencillo

En caso de que se sintiera intimidado por el ejemplo anterior, aquí tiene otro ejemplo que debería dejar las cosas muy claras.

Problema: Tienes una lista que contiene nombres y tienes que imprimir cada nombre con su índice.

Tu código:

li = ["John", "Rock", "Brock"]
i = 1
for i in li:
    print(i, li[i])

Salida:

Traceback (most recent call last):
  File "D:/PycharmProjects/pythonProject1/TypeError part2.py", line 4, in <module>
    print(i, li[i])
TypeError: list indices must be integers or slices, not str

✨ Solución:

En el código anterior, la variable i representa un item dentro de la lista y no un índice. Por lo tanto, cuando intenta usarlo como índice dentro del for loop, genera un TypeError: los índices de lista deben ser números enteros o sectores, no str.

Para evitar este error, puede utilizar la función enumerate() o el método len() junto con el método range() como se muestra. en la siguiente solución.

li = ["John", "Rock", "Brock"]
print("***SOLUTION 1***")
# using range()+len()
for i in range(len(li)):
    print(i + 1, li[i])
print("***SOLUTION 2***")
# using enumerate()
for i, item in enumerate(li):
    print(i + 1, item)

Salida:

***SOLUTION 1***
1 John
2 Rock
3 Brock

***SOLUTION 2***
1 John
2 Rock
3 Brock

Conclusión

Hemos llegado al final de esta guía completa para resolver TypeError: los índices de lista deben ser enteros o sectores, no 'Str'. Espero que este artículo te haya ayudado a aclarar todas tus dudas sobre TypeError: los índices de lista deben ser enteros o sectores, no str y puedas resolverlos con facilidad en el futuro.

Estén atentos y suscríbanse para recibir más artículos interesantes. ¡Feliz aprendizaje! 📚

Artículos relacionados