2010-10-04 6 views
2

c'est le code que je suis en train de créer la matrice 2dcréer un tableau 2d en python?

m=4 
tagProb=[[]]*(m+1) 
count=0 
index=0 
for line in lines: 
    print(line) 
    if(count < m+1): 
     tagProb[index].append(line.split('@@')[2].strip()) 
     count+=1 
    if(count == m+1): // this check to goto next index 
     count = 0 
     index+=1 
print(tagProb) 

je reçois l'o/p

[['0.0', '0.6', '0.05', '0.3', '0.05', '0.1', '0.0', '0.6', '0.0', '0.0', '0.1', '0.0', '0.0', '0.9', '0.0', '0.1', '0.0', '0.2', '0.7', '0.0', '0.1', '0.0', '0.9', '0.0', 0.0'], ['0.0', '0.6', '0.05', '0.3', '0.05', '0.1', '0.0', '0.6', '0.0', '0.0', '0.1', '0.0', .0', '0.9', '0.0', '0.1', '0.0', '0.2', '0.7', '0.0', '0.1', '0.0', '0.9', '0.0', '0.0'], '0.0', '0.6', '0.05', '0.3', '0.05', '0.1', '0.0', '0.6', '0.0', '0.0', '0.1', '0.0', '0.0','0.9', '0.0', '0.1', '0.0', '0.2', '0.7', '0.0', '0.1', '0.0', '0.9', '0.0', '0.0'] ] 

toutes les valeurs sont ajoutées et la liste a les mêmes valeurs. Comment puis-je éviter cela?

+3

Sidenote: si vous voulez faire des opérations matricielles, vous voulez vraiment utiliser http://numpy.scipy.org –

+0

D'accord avec Jim Brissom ci-dessus que numpy est la voie à suivre si vous faites des opérations matricielles sérieuses, mais Il existe une autre façon de simuler des tableaux 2d en Python: utilisez un dict, avec un tuple (ligne, colonne) pour la clé. Utile pour certaines applications, gênant pour les autres. –

Répondre

10

Vous utilisez * sur les listes, qui a une Gotcha - il fera une liste des lots de références à la même objet. C'est très bien pour les immutables comme int s ou tuple s, mais pas pour les mutables comme list, car changer un des objets les changera tous. Voir:

>>> foo = [[]]*10 
>>> foo[0].append(1) 
>>> foo 
[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]] 

Si vous ne voulez pas que cela se produise, la manière standard pour l'éviter est d'utiliser une compréhension de la liste, qui initialise la liste avec de nouveaux objets:

>>> bar = [[] for _ in range(10)] 
>>> bar[0].append(1) 
>>> bar 
[[1], [], [], [], [], [], [], [], [], []] 

Cependant, Ce problème n'apparaît pas beaucoup dans Python idiomatique, parce que l'initialisation d'une grande liste n'est pas une chose courante à faire - c'est vraiment une mentalité C. (Cela ne veut pas dire que ce n'est pas toujours la bonne chose à faire - Python est multi-paradigme!)

Sur une note différente, votre code n'est pas sympa. La boucle for en Python est conçue pour gérer les itérations sur les objets afin que vous n'ayez pas à gérer manuellement les variables d'index (index et count dans votre code). Il serait préférable de récrire comme suit:

import numpy as np 
m = 4 
tagProb = np.array(list(line.split("@@")[2].strip() for line in lines))) 
tagProb = tagProb.reshape((m+1,-1)).T 

Explication: la première ligne définit tagProb comme un tableau numpy (un type de tableau à base de C-rapide avec beaucoup de fonctions d'algèbre linéaire) d'une dimension avec toutes les valeurs une rangée. La deuxième ligne le contraint en une matrice de hauteur m+1 et en largeur déduite (notez qu'il doit être carré pour que cela fonctionne, vous pouvez le remplir avec None si nécessaire), puis le transposer. Je crois que c'est ce que fait votre itération, mais c'est un peu difficile à suivre - faites le moi savoir si vous voulez un coup de main avec ça.

+0

+1 pour l'initialisation des listes est un paradigme C – Falmarri

1

Créer une liste à la fois et de les insérer:

import copy 
m=4 
tagProb=[] 
count=0 
index=0 
for line in lines: 
    print(line) 
    innerlist = [] 
    if(count < m+1): 
     innerlist.append(line.split('@@')[2].strip()) 
     count+=1 
    if(count == m+1): // this check to goto next index 
     count = 0 
     index+=1 
     tagProb.append(copy.deepcopy(innerlist)) 
     innerlist = [] 
print(tagProb) 

Comme vous pouvez le voir, il y a un innerlist qui est ajouté à, puis pour chaque ligne, il ajoute la liste à la liste des listes. (Vous voudrez peut-être faire une copie de la liste, cependant).

+0

cela a fonctionné avec un petit changement – harshit

0
m=4 
tagProb=[] 
count=0 
index=0 
innerlist = [] 
for line in lines: 
print(line) 

if(count < m+1): 
    innerlist.append(line.split('@@')[2].strip()) 
    count+=1 
if(count == m+1): // this check to goto next index 
    count = 0 
    index+=1 
    tagProb.append(innerlist) 
    innerlist = [] 
print(tagProb)