Partage
  • Partager sur Facebook
  • Partager sur Twitter

Liste à plusieurs indices

list assignment index out of range

    13 septembre 2010 à 11:07:14

    Bonjour

    Je fais ma première classe python. J'ai un problème avec la variable pointsK. C'est un tableau à deux indices k et j. Je ne sais pas comment le remplir au fur et à mesure. En fait je suis un peu perdu par le fait qu'il ne soit pas déclaré. En Fortran ou en C j'aurais donné ses dimensions mais là ça plante avec le code "list assignment index out of range" sur la ligne où je fais :

    pointsK[k] = list()

    # -*-coding:utf-8 -*
    
    class Bandes(object):
    	""" Classes definissant les bandes d'énergie :
    		* nomFichier = fichier VASP de type EIGENVAL contenant les bandes
    	"""
    
    	# constructeur de la classe
    	def __init__(self, fichier = "EIGENVAL") :
    		""" constructeur : initialise le nom du fichier contenant les bandes """
    		self.nomFichier = fichier
    		print("Bandes contenues dans le fichier : " + self.nomFichier )
    
    	def lecture(self) :
    		""" lecture des bandes """
    
    		# ouverture en lecture seule du fichier contenant les bandes
    		fBandes = open( self.nomFichier , "r" )
    
    		# lecture totale du fichier
    		allLignes = fBandes.readlines()
    
    		# enregistrement des bandes sur chaque pts k
    		k = -1
    		pointsK = list()
    		for i,ligne in enumerate(allLignes) :
    
    			if i <= 4 :
    				# header du fichier
    				continue
    
    			elif i == 5 :
    				# infos utiles ligne 6
    				elementsLigne = ligne.split()
    				Nelectrons  = int( elementsLigne[0] )
    				nbrePointsK = int( elementsLigne[1] )
    				NBANDS      = int( elementsLigne[2] )
    
    				print("nombre de points k : " + str(nbrePointsK) )
    				print("nombre de bandes   : " + str(NBANDS) )
    
    			else :
    				if not ligne.strip() :
    					k += 1
    					pointsK[k] = list()
    					j = 0
    					continue
    
    				#energie = (ligne.split())[1]
    				#print(energie)
    				#pointsK[k][j]
    				j += 1
    
    				if j == 2 :
    					break
    


    Pour l'exécution je fais :
    python3
    >>> from maclasse import *
    >>> b = Bandes()
    >>> b.lecture()



    Merci pour votre aide.

    Pour les tests, voilà un fichier qui est lu :

    8    8    1    1
      0.2042313E+02  0.5466853E-09  0.5466853E-09  0.5466853E-09  0.1000000E-15
      1.000000000000000E-004
      CAR 
     unknown system                          
       32   80   21
     
      0.5000000E+00  0.5000000E+00  0.5000000E+00  0.1250000E-01
       1       -3.9147
       2       -3.9147
       3       -3.9147
       4       -3.9147
       5       -1.2473
       6       -1.2473
       7       -1.2473
       8       -1.2473
       9        4.4467
      10        4.4467
      11        4.4467
      12        4.4467
      13        4.4467
      14        4.4467
      15        4.4467
      16        4.4467
      17        7.0969
      18        7.0969
      19        7.0969
      20        7.0969
      21        8.9757
     
      0.4736842E+00  0.4736842E+00  0.4736842E+00  0.1250000E-01
       1       -3.9525
       2       -3.9110
       3       -3.9110
       4       -3.9110
       5       -1.2372
       6       -1.2372
       7       -1.2372
       8       -1.1926
       9        4.3755
      10        4.3755
      11        4.3755
      12        4.4282
      13        4.4282
      14        4.4282
      15        4.4516
      16        4.4516
      17        7.1685
      18        7.1685
      19        7.1685
      20        8.9588
      21        8.9589
    
    • Partager sur Facebook
    • Partager sur Twitter
      13 septembre 2010 à 14:44:24

      Par défaut la liste est vide, mais tu peux ajouter des éléments avec la méthode append.

      En fortran ou C, on utilise souvent les tableaux, mais en Python la structure de base utilisée est la liste, ça se comporte un peu différemment.
      • Partager sur Facebook
      • Partager sur Twitter

      Blond, bouclé, toujours le sourire aux lèvres...

        12 octobre 2010 à 17:01:53

        Aussi, si tu veux accéder à un élément d'une liste alors qu'elle n'est pas crée, tu peux l'initialiser avec range ;)
        • Partager sur Facebook
        • Partager sur Twitter
          12 octobre 2010 à 17:19:13

          Perso quand j'initialise avec : liste = [None] * longueur

          Si tu vas mettre des nombres dedans ensuite, ça peut être intéressant d'initialiser avec None. Comme ça si une case n'a pas été remplie, ça se voit tout de suite...
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            12 octobre 2010 à 19:23:08

            On peut aussi utiliser le module array

            >>> import array
            >>> tab=array.array('i',(0,)*longueur) i indique que tu déclares un tableau de int
            


            • Partager sur Facebook
            • Partager sur Twitter

            Liste à plusieurs indices

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown