[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:
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:
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:
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
✨ 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()
yrange()
. 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! 📚