|
|
|
|
Bonjour tout le monde,
je suis débutant en python et je veux un coup de main:
je veux construire une matrice d'entiers à partir d'un fichier texte contenant les valeurs à stoker dans la matrice.
j'ai essayé de la façon suivante:
def creerMatrice(fichier):
""" Creation de la matrice a partir du fichier texte"""
f = open(fichier,"r")
matrice = f.readlines()
f.close()
return matrice
Le problème est que je ne peux pas modifier la mtrice obtenue:
par exemple: matrice[i][j] = x
TypeError: 'str' object does not support item assignment.
Configuration: Windows XP Internet Explorer 7.0
Logique, matrice est une liste de ligne (cf http://docs.python.org/lib/bltin-file-objects.html) et non un tableau
|
Bonsoir,
|
Effectivement, NumPy est la meilleure solution pour travailler avec des matrice.
|
# obtention des données
f = open('matrice',"r")
lignes = f.readlines()
f.close()
# définition d'une matrice vide
NL = len(lignes)
NC = len(lignes[0])
if NL>1:
NC = NC-1
print 'N_Lignes =',NL,' N_Colonnes =',NC
m = {}
for i in range(1,NL+1):
m[i] = {}
# remplissage de la matrice
for i in range(1,NL+1):
for j in range(1,NC+1):
m[i][j] = int(lignes[i-1][j-1])
# affichage de la matrice remplie
print '\nMatrice créée:'
for i in range(1,NL+1):
for j in range(1,NC+1):
print m[i][j],
print ''
print ''
lignes est une liste des lignes présentes dans le fichier 'matrice' NL = len(lignes) la longueur de la liste correspond au nombre d'éléments de la liste NC = len(lignes[0]) le nombre de caractères de la première ligne (numérotée 0) est le nombre de colonnes à condition que toutes les lignes du fichier aient le même nombre de caractères if NL>1: NC = NC-1 Il faut soustraire 1 à la longueur de la ligne pour tenir compte de la présence du signe de retour à la ligne (la plupart du temps invisible), car readlines() lit tous les caractères y compris celui de retour à la ligne. Pour voir le signe de retour à la ligne (qui est noté \n), il faut faire print lignes. Mais ceci n'est vrai que s'il n'y a pas qu'une seule ligne dans le fichier, sinon lignes ne comporte qu'une seule ligne sans le signe de retour à la ligne à la fin. m = {} crée un dictionnaire vide for i in range(1,NL+1): m[i] = {} définit NL éléments pour le dictionnaire m et les définit comme étant eux même des dictionnaires. À ce stade, m est donc un dictionnaire de NL dictionnaires, ces derniers étant de longueurs encore indéfinies. m[i][j] = int(lignes[i-1][j-1]) La numérotation des lignes et des colonnes de la matrice commence à 1, tandis que le premier élément de la liste 'lignes' est numéroté 0 et que le premier caractère de chaque ligne est numéroté 0. ----------------------------- Il serait aussi possible de définir la matrice comme un dictionnaire de listes. dicli = {}
for i in range(1,NL+1):
dicli[i] = []
for i in range(1,NL+1):
for j in range(1,NC+1):
dicli[i].append(int(lignes[i-1][j-1]))
print '\nMatrice dict de listes'
for i in range(1,NL+1):
for j in range(1,NC+1):
print dicli[i][j-1],
print ''
Mais le remplacement d'un élément d'une telle matrice serait compliqué par le fait qu'on ne peut pas facilement insérer ou remplacer un élément à une position donnée dans une liste. Un dictionnaire de dictionnaire est le mieux je pense.
|