2016-04-16 7 views
3

Mein 1-D-Array wird korrekt importiert und korrekt angezeigt, meine Logik funktioniert auch, wenn ich es von Hand mache, also bin ich mir nicht sicher, was falsch ist . . Wenn ich jeden Wertes in dem 1-D-Array in die 2-D-Kopie wird in ein ungeradees Muster zu kopieren sowie das Setzen der falschen Werte tun1-D-Array in einem 2-D-Array führt zu falschen Array-Werten

Dies ist der 1-D-Array:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] 

Dies ist die folgende Ausgabe:

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 
row: 0 col: 0 
0 
In loop... [[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]] 
row: 0 col: 1 
1 
In loop... [[2, 0, 0, 0], [2, 0, 0, 0], [2, 0, 0, 0], [2, 0, 0, 0]] 
row: 0 col: 2 
2 
In loop... [[3, 0, 0, 0], [3, 0, 0, 0], [3, 0, 0, 0], [3, 0, 0, 0]] 
row: 0 col: 3 
3 
In loop... [[4, 0, 0, 0], [4, 0, 0, 0], [4, 0, 0, 0], [4, 0, 0, 0]] 
row: 1 col: 0 
4 
In loop... [[4, 5, 0, 0], [4, 5, 0, 0], [4, 5, 0, 0], [4, 5, 0, 0]] 
row: 1 col: 1 
5 
In loop... [[4, 6, 0, 0], [4, 6, 0, 0], [4, 6, 0, 0], [4, 6, 0, 0]] 
row: 1 col: 2 
6 
In loop... [[4, 7, 0, 0], [4, 7, 0, 0], [4, 7, 0, 0], [4, 7, 0, 0]] 
row: 1 col: 3 
7 
In loop... [[4, 8, 0, 0], [4, 8, 0, 0], [4, 8, 0, 0], [4, 8, 0, 0]] 
row: 2 col: 0 
8 
In loop... [[4, 8, 9, 0], [4, 8, 9, 0], [4, 8, 9, 0], [4, 8, 9, 0]] 
row: 2 col: 1 
9 
In loop... [[4, 8, 10, 0], [4, 8, 10, 0], [4, 8, 10, 0], [4, 8, 10, 0]] 
row: 2 col: 2 
10 
In loop... [[4, 8, 11, 0], [4, 8, 11, 0], [4, 8, 11, 0], [4, 8, 11, 0]] 
row: 2 col: 3 
11 
In loop... [[4, 8, 12, 0], [4, 8, 12, 0], [4, 8, 12, 0], [4, 8, 12, 0]] 
row: 3 col: 0 
12 
In loop... [[4, 8, 12, 13], [4, 8, 12, 13], [4, 8, 12, 13], [4, 8, 12, 13]] 
row: 3 col: 1 
13 
In loop... [[4, 8, 12, 14], [4, 8, 12, 14], [4, 8, 12, 14], [4, 8, 12, 14]] 
row: 3 col: 2 
14 
In loop... [[4, 8, 12, 15], [4, 8, 12, 15], [4, 8, 12, 15], [4, 8, 12, 15]] 
row: 3 col: 3 
15 
In loop... [[4, 8, 12, 16], [4, 8, 12, 16], [4, 8, 12, 16], [4, 8, 12, 16]] 
Before return... [[4, 8, 12, 16], [4, 8, 12, 16], [4, 8, 12, 16], [4, 8, 12, 16]] 

Hier ist der Funktionscode:

def makeTwoArr(array, height, width): 
    print(array) 
    newArray=[] 
    line=[0]*width 
    for i in range(height): 
     newArray.append(line) 
    location=0 
    print(newArray) 
    for row in range(height): 
     for col in range(width): 
      print("row: ",row," col: ",col); 
      print(location) 
##   #print(array[location]) 
      newArray[col][row]=array[location] 
##   print(newArray) 
      location+=1 
      print("In loop...",newArray) 

    print("Before return...",newArray) 
    return newArray 

beide, ich und mein Computer s Der Cience-Professor kann nicht herausfinden, warum die Werte falsch sind oder warum er bestimmte Stellen bei der falschen Iteration füllt.

+0

Versuchen 'col' und' row' in 'newArray [col] [Zeile] = array [Ort]' tauschen. Ich denke, das sollte funktionieren. –

+1

@VivekJain Ich denke nicht. – miradulo

+0

Der Tausch wird benötigt, löst aber nicht das Geheimnis ....Die Zuweisung gilt irgendwie für alle Zeilen und die richtige Spalte. – roadrunner66

Antwort

3

Wenn Sie line=[0]*width verwenden und dann append(line) Sie tatsächlich mehr Referenzen auf die gleiche Linie erstellen, damit, wenn Sie eine Zeile in Ihren Loops ändern ändern Sie tatsächlich alle Zeilen. Sie müssen tatsächlich verschiedene Zeilen erstellen, so dass Werte nicht überall durch Referenz in derselben Liste während der Zuweisung geändert werden. Es ist immer wichtig, sich daran zu erinnern, dass die Listen veränderbar sind, und das Anfügen des gleichen erstellt Referenzen auf die gleiche Liste.


Als beiseite, ich bin zu raten, für Ihre (Bildungs-) Zwecke benötigen Sie Zuordnung in dieser Schleife Mode zu tun, aber wenn man so mehr idiomatisch mit der Standardbibliothek vorhatten Sie iter nutzen könnten und zip mit dem Entpacken, Listen von Listen zu erstellen, obwohl dies nur funktionieren würde, wenn Sie sicher sein sollten, dass Ihre ursprüngliche Liste die richtige Anzahl von Elementen hat. Dies funktioniert, indem Sie den gleichen Iterator an zip Ihre gewünschte Anzahl von Zeiten übergeben, um Ihre gesamte Sequenz zu entpacken.

new_arr = list(map(list,zip(*[iter(arr)]*4))) 

Ausgänge:

[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] 
+0

Sehr schöner Fang! – roadrunner66

+0

Ihr Fang hat es an mir und meinem Professor vorbei geschafft! Ein großes Dankeschön! –

+0

Schön, mehr Pythonic Weg! –

2

Wie Donkey Kong zu Recht erwähnt, sind Sie den Verweis auf die gleiche Linie zu schaffen. Auch die Schleife konstruiert ein bisschen falsch.

def makeTwoArr(array, height, width): 
    print(array) 
    newArray=[[0 for x in range(width)] for x in range(height)] 
    print(newArray) 
    row=0 
    col=0 

    # Use single loop where possible. Loop in a loop may hamper performance. 
    for location in range(0, len(array)): 
     print("row: ",row," col: ",col); 
     print(location) 
     newArray[row][col]=array[location] 
     col+=1 
     if col == width: 
      row+=1 
      col=0 
     print("In loop...",newArray) 

    print("Before return...",newArray) 
    return newArray 

oldarr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] 

newarr = makeTwoArr(oldarr, 4, 4) 
print "############" 
print ("New Array is", newarr) 

habe ich versucht, einen anderen Ansatz der Quell-Array anstelle der Ziel-Schleife. Der Grund war, eine einzelne Schleife anstelle von doppelten Schleifen zu haben. Obwohl beide als richtig angesehen werden könnten.

Bitte nehmen Sie diese Lösung als Ausgangspunkt und nicht als Kopierpastenlösung.

+1

Ich stimme dir und Donkey Kong, danke für das Posting es so. Ich stimme beiden zu, aber das hilft mir visuell zu sehen, was du meinst. Und nein, ich werde definitiv nicht nur kopieren und einfügen. Das anfängliche Array, das ich euch gegeben habe, ist eine super einfache Form von der, für die ich das verwenden muss. Deine Antwort hilft mir nur zu verstehen, wo ich falsch gelaufen bin. Vielen Dank! –

0

Ich glaube, dies geschieht, weil jede Zeile in new_array tatsächlich auf genau die gleiche Liste zeigt, line.

Code wie folgt ändern und es sollte funktionieren:

def makeTwoArr(array, height, width): 
    print(array) 
    newArray=[] 
    #line=[0]*width     # DON'T DO THIS 
    for i in range(height): 
     newArray.append([0]*width)  # DO THIS INSTEAD 
    location=0 
    print(newArray) 
    for row in range(height): 
     for col in range(width): 
      print("row: ",row," col: ",col); 
      print(location) 
      newArray[col][row]=array[location] 
      print(newArray) 
      location+=1 
      print("In loop...",newArray) 

    print("Before return...",newArray) 
    return newArray 
Verwandte Themen