2017-08-26 2 views
0

J'ai une liste de liste (tableData) et je veux retourner une nouvelle liste (cloneTable) qui affiche la longueur de chaque chaîne dans la liste d'origine afin que je puisse trouver la chaîne la plus longue en utilisant la fonction longestString. Je veux aussi garder les valeurs dans la liste originale. Le problème est qu'après l'exécution de ma fonction, la liste d'origine a été convertie en longueurs.Liste des valeurs accidentellement remplacées dans la fonction

Je suis sûr que le code peut être meilleur (j'apprends encore) mais je veux aussi comprendre pourquoi il y a ce problème. Je n'ai pas assigné tableData Je passe les valeurs de tableData à assigner à cloneTable. Merci pour l'aide!

#A list of lists 
tableData = [ 
    ['apples','oranges','cherries','banana'], #6,7,8,6 
    ['Alice','Bob','Carol','David'], #5,3,5,5 
    ['dogs','cats','moose','goose'], #4,4,5,5 
    ['car','train','helicopter','plane'] #3,5,10,5 
] 

#longestString function finds the longest string in each list of list 
def longestString(table): 
    cloneTable = [] 
    output = [] 

    for v1 in range(len(table)): 
     cloneTable = cloneTable + [table[v1]] 

    for v1 in range(len(cloneTable)): 
     for v2 in range(len(cloneTable)): 
      cloneTable[v1][v2] = len(cloneTable[v1][v2]) 

     cloneTable[v1].sort() 

    for v1 in range(len(cloneTable)): 
     output = output + [cloneTable[v1][-1]] 

    return output 

################################################################## 

for v1 in range(len(tableData)): #returns the list - OK 
    print(tableData[v1]) 

print(longestString(tableData)) #returns the longest strings - OK 

for v1 in range(len(tableData)): #returns a list of string lengths - Not OK 
    print(tableData[v1]) 
+0

Une solution plus avancée pourrait être quelque chose comme '[max (l, key = len) pour l dans TableData]' Cela profite des [max] (https: //docs.python.org/3/library/functions.html#max) fonction et un concept appelé [list comprehension] (http://www.secnetix.de/olli/Python/list_comprehensions.hawk) –

Répondre

0

Je ne sais pas pourquoi vous appelez votre liste cloneTable si elle est juste une copie de référence/mission que vous faites.

Vous devez effectuer une copie complète de votre liste si vous voulez vraiment la cloner. Une solution multi-python implique l'utilisation copy.deepcopy:

import copy 
def longestString(table): 
    cloneTable = [] 
    output = [] 

    cloneTable = copy.deepcopy(table) 
    ... 
+0

la notation de tranche sera aussi travailler 'table [:]' – Soviut

+1

@Sovié incorrect, nous avons affaire à une liste imbriquée. –

+0

Ah vous avez raison, j'ai raté cela en raison de l'indentation. Je vais clarifier cela dans la question. – Soviut