2017-08-26 14 views
0

Ich habe eine Liste der Liste (tableData) und ich möchte eine neue Liste (cloneTable), die die Länge jeder Zeichenfolge in der ursprünglichen Liste ausgibt, so kann ich die längste Zeichenfolge mit der Funktion finden längsteString. Ich möchte auch die Werte in der ursprünglichen Liste beibehalten. Das Problem ist, dass nach der Ausführung meiner Funktion die ursprüngliche Liste in Längen konvertiert wurde.Listenwerte versehentlich in Funktion ersetzt

Ich bin der Code sicher besser sein kann (ich lerne immer noch), aber ich möchte auch verstehen, warum es dieses Problem ist. Ich habe tableData nicht zugewiesen. Ich übergebe die Werte aus tableData, um sie cloneTable zuzuordnen. Danke für die Hilfe!

#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

Eine fortschrittlichere Lösung könnte so etwas wie '[max (l, key = len) für l in Table] sein' Dies nutzt die [max] (https: //docs.python.org/3/library/functions.html#max) Funktion und ein Konzept namens [Liste Verständnis] (http://www.secnetix.de/olli/Python/list_comprehensions.hawk) –

Antwort

0

nicht sicher, warum Sie Ihre Liste cloneTable nennen, wenn es nur eine Referenzkopie/Zuordnung Sie tun.

Sie sollten eine tiefe Kopie der Liste durchführen, wenn Sie es wirklich klonen möchten. Eine Quer Python Lösung beinhaltet copy.deepcopy mit:

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

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

Slice-Notation wird auch arbeiten 'Tabelle [:]' – Soviut

+1

@Soviut falsch, sind wir mit einer verschachtelten Liste handeln. –

+0

Ah, du hast recht, ich verpasst, dass aufgrund der Vertiefung. Ich werde das in der Frage klären. – Soviut