2013-01-04 5 views
-1

Je crée une liste nommée 'temp' dans une boucle et l'ajoute à une liste mère 'trouble'. Quand j'ajoute «temp» à «trouble» dans la deuxième partie de la boucle, le «trouble» lui-même semble changer. J'ai simplifié le code pour inclure uniquement cette instance pour plus de clarté.Python: Ajout de la liste à la liste changeante

award=[[['A',1],['B',1]],[['A',1],['C',1]],[['A',1],['C',1],['D',1]]] 

trouble=[] 
print '\n' 
for n in range(len(award)-1): 
    temp=[] 
    for i in range(len(award[n])): 
      temp.append(award[n][i]) 
    for i in range(len(award[n+1])): 
      for k in range(len(temp)): 
      if(temp[k][0]==award[n+1][i][0]): 
       temp[k][1]+=award[n+1][i][1] 
       break 
     else: 
      temp.append(award[n+1][i]) 

    print 'temp', temp 
    trouble.append(temp) 
    print '\tn = ',n, '\n\ttrouble' 
    for i in range(len(trouble)): 
     print trouble[i] 
    print '\n' 

La sortie ressemble à ceci:

temp [['A', 2], ['B', 1], ['C', 1]] 
    n = 0 
    trouble 
[['A', 2], ['B', 1], ['C', 1]] 


temp [['A', 2], ['C', 2], ['D', 1]] 
    n = 1 
    trouble 
[['A', 2], ['B', 1], ['C', 2]] 
[['A', 2], ['C', 2], ['D', 1]] 

Je ne comprends pas pourquoi [ 'C', 1], qui n'a pas (selon moi) été touché après la première instance de annexant, est changé après la deuxième instance de l'ajout.

Toute aide sera grandement appréciée.

Merci d'avance.

Anagha Madhusudanan

+1

désolé, c'est horrible code –

+1

qu'est-ce que vous essayez réellement de faire ici? –

+0

Je ne veux pas être critique, mais ce code est presque illisible. Si vous avez absolument besoin d'accéder aux index numériques des éléments d'une liste en python, accédez-y via 'pour idx, item dans enumerate (lst)'. Au-delà de cette suggestion pour vous aider à nettoyer cela, je n'ai honnêtement aucune capacité à déchiffrer ce que vous voulez. Je ne peux pas le faire mentalement assez bien pour voir où vous vous trompez, mais cela n'aide pas que votre liste de récompenses soit profondément imbriquée avec des sous-listes de différentes longueurs. –

Répondre

0

Je pense que le problème est tout à cause de cela:

temp.append(award[n+1][i]) 

La référence de prix [1] [1] a ajouter des problèmes à deux reprises, de sorte que tout élément a été ajouté, tout la valeur sera modifiée. vous devriez faire une copie profonde quand ajouter la liste dans la liste mère.

award=[[['A',1],['B',1]],[['A',1],['C',1]],[['A',1],['C',1],['D',1]]] 

trouble=[] 
print '\n' 
for n in range(len(award)-1): 
    temp=[] 
    for i in range(len(award[n])): 
     tem = award[n][i][:] // deep copy 
     temp.append(tem) 
    for i in range(len(award[n+1])): 
     for k in range(len(temp)): 
      if(temp[k][0]==award[n+1][i][0]): 
       temp[k][1]+=award[n+1][i][1] 
       break 
     else: 
      tem = award[n+1][i][:] # deep copy 
      temp.append(tem) 

    print 'temp', temp 
    trouble.append(temp) 
    print '\tn = ',n, '\n\ttrouble' 
    for i in range(len(trouble)): 
     print trouble[i] 
    print '\n' 



# temp [['A', 2], ['B', 1], ['C', 1]] 
    # n = 0 
    # trouble 
# [['A', 2], ['B', 1], ['C', 1]] 


# temp [['A', 2], ['C', 2], ['D', 1]] 
    # n = 1 
    # trouble 
# [['A', 2], ['B', 1], ['C', 1]] 
# [['A', 2], ['C', 2], ['D', 1]] 
+0

Merci une tonne ... travaillé. – user1715985

Questions connexes