Python >> Tutoriel Python >  >> Python

Comment réparer TypeError :les index de liste doivent être des entiers ou des tranches, et non "Str" ?

✯ Présentation

Problème : Correction de TypeError: list indices must be integers or slices, not str en Python.

Exemple : Le code suivant liste un certain nombre de transactions saisies par l'utilisateur.

t = [5000, 1500, 10000, 20000, 6500, 8000, 9000, 15000, 2000, 16000]
n = input('Enter the Number of transactions you want to check: ')
for i in n:
    print(t[i])

Sortie :

Enter the Number of transactions you want to check: 5
Traceback (most recent call last):
  File "D:/PycharmProjects/PythonErrors/rough.py", line 4, in <module>
    print(t[i])
TypeError: list indices must be integers or slices, not str

Solution : Veuillez ne suivre cette solution qu'après avoir parcouru les scénarios mentionnés ci-dessous .

t = [5000,1500,10000,20000,6500,8000,9000,15000,2000,16000]
n = input('Enter the Number of transactions you want to check: ')
for i in range(int(n)):
    print(t[i])

Des bugs comme ceux-ci peuvent être vraiment frustrants ! ? Mais, après avoir fini de lire cet article, ces bogues stupides ne seront plus un sujet de préoccupation pour vous. Par conséquent, pour comprendre ce qui cause de telles erreurs et comment les éviter, il est important de répondre à quelques questions :

  • Qu'est-ce qu'un TypeError ? en Python ?
  • Pourquoi Python lève-t-il TypeError: list indices must be integers or slices, not str ? ?
  • Comment corrige-t-on TypeError: list indices must be integers or slices, not str ?

✯ Qu'est-ce que TypeError en Python ?

Python génère une TypeError lorsque vous essayez d'utiliser une fonction ou d'appeler un opérateur sur quelque chose dont le type est incorrect.

Il existe des raisons courantes qui sont responsables de l'apparition de TypeError en Python sont :

  • Si vous essayez d'effectuer une certaine opération qui n'est pas prise en charge entre deux types d'objets.
  • Si vous essayez d'appeler un appelant/une fonction non appelant.
  • Si vous essayez d'itérer sur un identifiant non itératif.

Exemple :

radius = input("Enter the radius: ")  # string input
print('Circumference = ', 2 * 3.14 * radius)

Sortie :

Enter the radius: 5
Traceback (most recent call last):
  File "D:/PycharmProjects/PythonErrors/TypeError Can’t Multiply Sequence by non-int of Type ‘float’ In Python.py", line 2, in <module>
    print('Circumference = ',2*3.14*radius)
TypeError: can't multiply sequence by non-int of type 'float'

 ? Explication : Python n'autorise pas la multiplication d'une valeur de chaîne et d'une valeur flottante. Par conséquent, lorsque vous essayez d'effectuer ce type d'opération non prise en charge en Python, cela génère un TypeError .

Cela nous amène à notre prochaine question !

✨ Pourquoi Python génère-t-il une erreur de type :les indices de liste doivent être des entiers ou des tranches, et non "Str" ?

 ? Vous pouvez accéder à des éléments dans des types de données séquentiels tels que des chaînes, des tuples et des listes à l'aide de leur index. Maintenant, ces index doivent toujours être des nombres entiers . Lorsque vous essayez d'accéder à l'index de la liste à l'aide d'une valeur de chaîne, alors Python soulève - TypeError: list indices must be integers or slices, not str.

Examinons quelques exemples pour comprendre comment résoudre cette erreur.

✨ Exemple 1

Problème : Le programme suivant vise à attribuer un numéro de matricule à un élève.

roll = [1, 2, 3, 4, 5]
name = ['Shubham', 'Chris', 'Yakun', 'Jesus', 'Krishna']
i = input("Enter roll no. : ")
print("Name: "+name[i-1]+"\nRoll: "+i)

Sortie :

Enter roll no. : 5
Traceback (most recent call last):
  File "D:/PycharmProjects/PythonErrors/rough.py", line 4, in <module>
    print("Name: "+name[i]+"\nRoll: "+i)
TypeError: list indices must be integers or slices, not str

Plongeons-nous maintenant dans les solutions.

 ? Solution :accepter l'entrée de l'utilisateur sous forme d'entier

roll = [1, 2, 3, 4, 5]
name = ['Shubham', 'Chris', 'Yakun', 'Jesus', 'Krishna']
i = int(input("Enter roll no. : "))
print("Name: "+name[i-1]+"\nRoll: "+str(i))

Sortie :

Enter roll no. : 1
Name: Shubham
Roll: 1

Explication :

Pour éviter un TypeError dans le scénario ci-dessus :

  • Acceptez l'entrée de l'utilisateur sous forme d'entier à l'aide de int() méthode.
  • Assurez-vous de concaténer des valeurs du même type de données, c'est-à-dire des chaînes, à l'aide de str() méthode.

Passons maintenant à un scénario un peu plus complexe.

✨ Exemple 2

Problème :étant donné une liste de dictionnaires ; comment extraire une certaine valeur en utilisant son index ?

people = [
    {'Name': 'Harry',
     'phone': '6589',
     'address': '90 Eastlake Court'
     },
    {
        'Name': 'Ben',
        'phone': '5693',
        'address': '560 Hartford Drive'
    },
    {
        'Name': 'David',
        'phone': '8965',
        'address': '96 SW 42nd'
    }
]
search = input('Enter the name of the person to find his address: ')
for n in (people):
    if search.lower() in people['Name'].lower():
        print('Name: ', search)
        print('Address: ', people['address'])
        break
else:
    print('Invalid Entry!')

Sortie :

Enter the name of the person to find his address: harry
Traceback (most recent call last):
  File "D:/PycharmProjects/PythonErrors/rough.py", line 19, in <module>
    if search.lower() in people['Name'].lower():
TypeError: list indices must be integers or slices, not str

➥ Dans l'exemple ci-dessus, nous avons essayé d'accéder à l'index en utilisant la clé 'Name' qui est une chaîne. Comme vous ne pouvez pas accéder à un index dans une liste à l'aide d'une chaîne, Python lève donc TypeError: list indices must be integers or slices, not str .

Voyons maintenant les solutions.

 ? Méthode 1 :Utilisation de range() + len()

  • Pour accéder à un index particulier à l'intérieur de la liste, vous devez trouver la longueur de la liste en utilisant le len() méthode. Cette valeur sera un entier. Vous pouvez maintenant utiliser le range() sur la fonction de longueur calculée pour itérer sur chaque élément de la liste.
  • Syntaxe pour accéder à une valeur particulière à partir d'un dictionnaire particulier dans une liste :
    • list_name[index_of_dictionary]['Key_within_dictionary']
    • exemple :- people[n]['name']
people = [
    {'Name': 'Harry',
     'phone': '6589',
     'address': '90 Eastlake Court'
     },
    {
        'Name': 'Ben',
        'phone': '5693',
        'address': '560 Hartford Drive'
    },
    {
        'Name': 'David',
        'phone': '8965',
        'address': '96 SW 42nd'
    }
]
search = input('Enter the name of the person to find his address: ')
for n in range(len(people)):
    if search.lower() in people[n]['Name'].lower():
        print('Name: ', people[n]['Name'])
        print('Address: ', people[n]['address'])
        break
else:
    print('Invalid Entry!')

Sortie :

Enter the name of the person to find his address: harry
Name:  Harry
Address:  90 Eastlake Court

 ? Méthode 2 :Utiliser enumerate()

➥ Pythons intégrés enumerate(iterable) la fonction vous permet de boucler sur tous les éléments d'un iterable et leurs compteurs associés.

L'exemple suivant montre comment le enumerate() intégré de Python permet d'accéder aux éléments d'un dictionnaire au sein d'une liste :

people = [
    {'Name': 'Harry',
     'phone': '6589',
     'address': '90 Eastlake Court'
     },
    {
        'Name': 'Ben',
        'phone': '5693',
        'address': '560 Hartford Drive'
    },
    {
        'Name': 'David',
        'phone': '8965',
        'address': '96 SW 42nd'
    }
]
search = input('Enter the name of the person to find his address: ')
for n, name in enumerate(people):
    if search.lower() in people[n]['Name'].lower():
        print('Name: ', people[n]['Name'])
        print('Address: ', people[n]['address'])
        break
else:
    print('Invalid Entry!')

Sortie :

Enter the name of the person to find his address: ben
Name:  Ben
Address:  560 Hartford Drive

 ? Solution 3 :Utiliser la compréhension de liste

Ce n'est peut-être pas la solution la plus Pythonique ou la plus simple des solutions, mais c'est une excellente astuce et un hack rapide pour dériver votre solution en une seule ligne de code.

people = [
    {'Name': 'Harry',
     'phone': '6589',
     'address': '90 Eastlake Court'
     },
    {
        'Name': 'Ben',
        'phone': '5693',
        'address': '560 Hartford Drive'
    },
    {
        'Name': 'David',
        'phone': '8965',
        'address': '96 SW 42nd'
    }
]
search = input('Enter the name of the person to find his address: ')
print(next((item for item in people if search.lower() in item["Name"].lower()), 'Invalid Entry!')['address'])

Sortie :

Enter the name of the person to find his address: harry
90 Eastlake Court

Conclusion

J'espère que cet article vous a aidé! ? Veuillez rester à l'écoute et abonnez-vous pour des articles plus passionnants. Bon apprentissage! ?

  • Voulez-vous maîtriser rapidement l'IDE Python le plus populaire ?
  • Ce cours vous fera passer de débutant à expert en PyCharm en 90 minutes environ.
  • Pour tout développeur de logiciels, il est crucial de bien maîtriser l'IDE, d'écrire, de tester et de déboguer un code de haute qualité avec peu d'effort.

Rejoignez la Masterclass PyCharm maintenant, et maîtrisez PyCharm d'ici demain !