Python >> Tutoriel Python >  >> Python

Python TypeError :les indices de tranche doivent être des nombres entiers ou aucun ou avoir une méthode __index__ Solution

    À l'aide du découpage Python, nous pouvons accéder à une séquence d'éléments ou de caractères à partir des objets de données List, Tuple et String. Le découpage utilise une syntaxe similaire à l'indexation où il accepte la valeur d'index comme une plage d'où à où la séquence doit être renvoyée.

    Le numéro d'index que nous spécifions dans le découpage d'une liste doit être un nombre entier valide, sinon nous recevons l'erreur TypeError: slice indices must be integers or None or have an __index__ method . Cette erreur est très courante lorsque nous utilisons un nombre flottant au lieu d'un entier pour une valeur d'index.

    Dans ce didacticiel de résolution d'erreurs Python, nous discuterons en détail de l'instruction d'erreur suivante et passerons également en revue un exemple de scénario courant qui illustre cette erreur.

    Python Error TypeError :les indices de tranche doivent être des nombres entiers ou aucun ou avoir une méthode __index__

    Le découpage Python ne prend en charge que les numéros d'index valides, et si nous utilisons une chaîne ou un nombre flottant pour la plage d'index, nous recevons le " TypeError: slice indices must be integers or None or have an __index__ method " Erreur.

    Exemple d'erreur

    x = ["a", "b", "c", "d", "e"]
    
    #first 4 items using slicing
    print(x[0:4.0])

    Sortie

    Traceback (most recent call last):
      File "main.py", line 4, in 
        print(x[0:4.0])
    TypeError: slice indices must be integers or None or have an __index__ method

    L'instruction d'erreur ci-dessus comporte deux sous-instructions Type d'exception et Message d'erreur

    1. Erreur de type
    2. les indices de tranche doivent être des nombres entiers ou aucun ou avoir une méthode __index__

    1. Erreur de type

    Le TypeError est une exception standard, qui est déclenchée par l'interpréteur de Python lorsque nous essayons d'effectuer une opération invalide sur un objet de données. Cette erreur se produit également lorsque nous passons un mauvais type de données à une méthode ou à une fonction. Dans l'exemple ci-dessus, pour le découpage qui n'accepte que des valeurs entières, nous avons passé une valeur flottante qui déclenche l'exception TypeError.

    2. les indices de tranche doivent être des entiers ou Aucun ou avoir une méthode __index__

    Le slice indices must be integers or None or have an __index__ method est le message d'erreur, cette balise avec l'exception TypeError. Ce message d'erreur nous indique que nous ne transmettons pas de valeur entière pour les indices lors du découpage de la liste, du tuple ou de la chaîne.

    Exemple de scénario courant

    Cette instruction d'erreur ne se produit que dans un programme Python lorsque nous utilisons accidentellement un type de données inapproprié pour les valeurs de découpage.

    Exemple

    Supposons que nous ayons une liste ordonnée des 10 meilleurs IDE Python, et que nous devions écrire un programme qui accepte un nombre de l'utilisateur de 1 à 10, et imprimer autant d'IDE sur la sortie de la console. Commençons par initialiser la liste des 10 meilleurs IDE Python.

    top_ides = ["PyCharm",
                "VSCode",
                "Atom",
                "Spyder",
                "Thonny",
                "Jupyter Notebook" ,
                "IDLE",
                "PyDev",
                "Wing",
                "Eric"
                ]

    Écrivez maintenant la fonction d'entrée qui accepte la plage jusqu'à laquelle l'utilisateur souhaite accéder aux IDE.

    n = input("Enter N(0 to 10) for the Top N Ide's: ")

    découper la liste IDE pour les n meilleurs ides

    #slicing to get top n ide's
    top_n_ides = top_ides[:n]

    Imprimez maintenant les meilleures idées

    print(f"The top {n} Python IDE's are")
    for ide in top_n_ides:
        print(ide)

    Sortie

    Enter N(0 to 10) for the Top N Ide's: 5
    Traceback (most recent call last):
      File "main.py", line 16, in 
        top_n_ides = top_ides[:n]
    TypeError: slice indices must be integers or None or have an __index__ method

    Briser le code

    Dans l'exemple ci-dessus, nous recevons l'erreur après que l'utilisateur a saisi la valeur pour n . L'entrée Python () accepte les données d'entrée de l'utilisateur et les stocke sous forme de valeur de chaîne. Cela signifie dans l'exemple la valeur de n est également de type chaîne de données. Et quand nous avons utilisé ce n valeur pour le découpage de liste dans le top_n_ides = top_ides[:n] instruction Python génère l'erreur TypeError: slice indices must be integers or None or have an __index__ method , car le découpage n'accepte qu'un type de données entier, pas une chaîne.

    Solution

    Chaque fois que nous saisissons une valeur de l'utilisateur, nous devons taper convertit en fonction de son utilisation. Dans l'exemple ci-dessus, nous acceptons l'entrée pour le découpage de liste, et le découpage n'accepte que le type de données int, nous devons donc convertir la valeur des données d'entrée en int.

    top_ides = ["PyCharm",
                "VSCode",
                "Atom",
                "Spyder",
                "Thonny",
                "Jupyter Notebook" ,
                "IDLE",
                "PyDev",
                "Wing",
                "Eric"
                ]
    #convert the input to integer
    n = int(input("Enter N(0 to 10) for the Top N Ide's: "))
    
    #slicing to get top n ide's
    top_n_ides = top_ides[:n]
    
    print(f"The top {n} Python IDE's are")
    for ide in top_n_ides:
        print(ide)

    Sortie

    Enter N(0 to 10) for the Top N Ide's: 5
    The top 5 Python IDE's are
    PyCharm
    VSCode
    Atom
    Spyder
    Thonny

    Maintenant, notre code s'exécute sans aucune erreur.

    Conclusion

    Le découpage en Python est une syntaxe qui nous permet d'obtenir une séquence de caractères ou d'éléments à partir des objets indexables comme List, Tuple et string. La syntaxe de découpage n'accepte qu'une valeur d'index entière, et pour toutes les autres valeurs de données, elle renvoie le TypeError: slice indices must be integers or None or have an __index__ method Erreur.

    Chaque fois que vous voyez cette erreur dans votre programme Python, la première chose que vous devez vérifier est le type de données de l'identifiant que vous transmettez entre crochets pour le découpage de la liste, et convertissez-le en int.

    Si vous obtenez toujours cette erreur dans votre programme Python, veuillez partager votre code et votre requête dans la section des commentaires. Notre équipe de développeurs essaiera de vous aider dans le débogage.

    Bon codage !