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.

TypeError: list indices must be integers, not list

+2 votes

Pendant mon projet, j'ai besoin de comparer plusieurs coordonnées pour voir si des points sont voisins, chaque point à 4 coordonnées.
Ces fonctions sont définies comme suit :

def is_neighboor(coord_srce,coord_dest):
    if ((bas_gauche(coord_srce,coord_dest)==True) or
       (bas_droit(coord_srce,coord_dest)==True) or
       (haut_droit(coord_srce,coord_dest)==True) or
       (haut_gauche(coord_srce,coord_dest)==True)) :
        return True
    else:
        return False

def bas_gauche(coord_srce,coord_dest):
    if (coord_dest[0] == coord_srce[0]-30) and (coord_dest[1] == coord_srce[1]+30) and (coord_dest[2] == coord_srce[2]-30) and (coord_dest[3] == coord_srce[3]+30):
        return True

def bas_droit(coord_srce,coord_dest):
    if (coord_dest[0] == coord_srce[0]+30) and (coord_dest[1] == coord_srce[1]+30) and (coord_dest[2] == coord_srce[2]+30) and (coord_dest[3] == coord_srce[3]+30):
        return True

def haut_droit(coord_srce,coord_dest):
    if (coord_dest[0] == coord_srce[0]+30) and (coord_dest[1] == coord_srce[1]-30) and (coord_dest[2] == coord_srce[2]+30) and (coord_dest[3] == coord_srce[3]-30):
        return True

def haut_gauche(coord_srce,coord_dest):
    if (coord_dest[0] == coord_srce[0]-30) and (coord_dest[1] == coord_srce[1]-30) and (coord_dest[2] == coord_srce[2]-30) and (coord_dest[3] == coord_srce[3]-30):
        return True

Ensuite je récupere une liste coordonnées pour ensuite les comparer entre eux:

print(list_coords)
>>[[200, 260, 220, 280], [200, 200, 220, 220], [290, 290, 310, 310], [230, 230, 250, 250], [170, 290, 190, 310], [260, 260, 280, 280], [170, 230, 190, 250], [260, 200, 280, 220], [170, 170, 190, 190], [230, 170, 250, 190], [290, 230, 310, 250], [230, 290, 250, 310], [290, 170, 310, 190]]

for i in list_coords:
    for j in list_coords:
        if is_neighboor(list_coords[i],list_coords[j]):
            print(list_coords[i],' est voisin de ',list_coords[j]) 

Erreur :

if is_neighboor(list_coords[i],list_coords[j]):
TypeError: list indices must be integers, not list

Euh...Ma fonction agit bel et bien sur des listes non? Pourquoi est-ce qu'il attend des integers =/

demandé 22-Avr-2015 par boblinux (3,092 points)

2 Réponses

+1 vote
 
Meilleure réponse

Fixed, Merci @ashgan
quelle inattention lol

for i in list_coords:
    for j in list_coords:
        if is_neighboor(i,j):
            print(i,' est voisin de ',j) 
répondu 22-Avr-2015 par boblinux (3,092 points)

petit trick au passage : n'hésites pas a utiliser le debugger python.

un petit

import pdb; pdb.set_trace()

pour mettre un point de debug. Quand l'interpreteur arrive sur cette ligne, il t'ouvre un shell dans le contexte de ton programme, tu peux inspecter l'état de tes variables (typiquement dans un cas comme celui-ci pour regarder les valeurs de i et j)

Il y a aussi ipdb que je préfère (il ouvre un shell ipython au lieu de l'interpreteur python par defaut, avec plein de trucs cools, notament l'autocompletion)

+4 votes

j'ai pas épluché le code, mais en 1ere lecture en diagonale, dans ta boucle de comparaison, i est une liste, pas un int.
forcément, ca coince quand tu joue avec des index de listes.

une 2eme lecture va être nécessaire pour proposer un truc, par contre.

répondu 22-Avr-2015 par ashgan (698 points)
...