Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Erreur : 'int' object is not subscriptable

+1 vote

Je ne comprends pas où est mon erreur. Je travaille avec des listes de chaînes de caractères et je voulais représenter un graphe par sa liste d'adjacence.
Voici mon code :

def fils (a,b) :
    if a[1:]==b[:len(b)-1] :
        return True
    else :
        return False

def liste_fils(a,liste) :
    L=[]
    for i in liste :
        if fils(a,i) :
            L+=[i]
    return L

def graphe(liste) :
    n=len(liste)
    L=[['']]
    for i in range(n) :
        L[i] = liste_fils(i,liste)
    return L

Voici mon erreur :

In[136] : L
Out[136]: ['CCT', 'GCC', 'AAA', 'GAA', 'TGA', 'CTG', 'TGC']

graphe(L)
Traceback (most recent call last):

  File "<ipython-input-137-b437b2714274>", line 1, in <module>
    graphe(L)

  File "C:/Users/danie/Desktop/TIPE/code.py", line 49, in graphe
    L[i] = liste_fils(i,liste)

  File "C:/Users/danie/Desktop/TIPE/code.py", line 41, in liste_fils
    if fils(a,i) :

  File "C:/Users/danie/Desktop/TIPE/code.py", line 33, in fils
    if a[1:]==b[:len(b)-1] :

TypeError: 'int' object is not subscriptable
demandé 17-Mai par Daniel

2 Réponses

+1 vote

ton a est un int sorti par le range(n)

# les listes ne fonctionnent pas comme les dicts
L[i] = liste_fils(i,liste) / L.append(liste_fils(i, liste))
# et j'aurais écris ce passage sans len
if a[1:]==b[:len(b)-1] : /  if a[1:] == b[:-1:] :
répondu 17-Mai par ptank (306 points)
+2 votes

Ton erreur est dans la fonction graphe() qui appelle liste_fils() avec i entier.

Si je comprends correctement la fonction graphe(), elle devrait devenir:

def graphe(liste) :
    g = {}
    for elem in liste
        g[elem] = liste_fils(elem, liste)
    return g

A noter qu'on pourrait aussi écrire les boucles avec des listes et dictionnaires en intension (voir ici et ). Ce qui donnerait:

def fils(pere, fils):
    return fils[1:] == pere[:-1]

def graphe(liste):
    return {p: [f for f in liste if fils(f, p)]
            for p in liste}

Enfin, quelques remarques sur ton code:

  • Ta fonctions fils() fait du travail pour rien. Tu peux directement renvoyer le résultat de la comparaison sans for de if.
  • 'L+=[i]' est vraiment à éviter. Il faut lui préférer 'L.append(i)' qui sera plus clair et plus efficace.
répondu 17-Mai par bubulle (2,082 points)
...