簡體   English   中英

將二維數組轉換為二維數組會導致錯誤的數組值

[英]1-D array into a 2-D array results in wrong array values

我的1-D陣列正確導入並正確顯示,我的邏輯也適用於我手工操作,所以我不確定是什么問題。 當我將1-D數組中的每個值復制到2-D時,它正在進行奇怪的復制模式以及輸入錯誤的值。

這是一維數組:

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

這是以下輸出:

[[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]]

這是功能代碼:

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

我和我的計算機科學教授都無法弄清楚為什么這些值是錯誤的,或者為什么它在錯誤的迭代中填充某些點。

當你使用line=[0]*width然后append(line)你實際上創建了對同一行的多個引用 ,因此當你修改循環中的一行時,你實際上修改了所有行。 您需要實際創建不同的行,以便在分配期間通過引用在同一列表中的任何位置不會修改值。 記住列表是可變的並且附加相同的列表創建對同一列表的引用始終是重要的。


順便說一句,我猜你的(教育)目的,你需要以這種循環方式進行任務,但如果你試圖用標准庫更加慣用,你可以使用iterzipzip來創建列表列表,雖然這只會讓您確信您的原始列表具有正確數量的元素。 這可以通過傳遞相同的迭代器來zip所需的次數來解壓縮整個序列。

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

輸出:

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

正如大金剛正確提到的,你正在創建對同一行的引用。 此外,循環結構有點不正確。

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)

我嘗試了一種不同的方法來循環源數組而不是目標。 原因是有單循環而不是雙循環。 雖然兩者都可以被認為是正確的。

請將此解決方案作為起點,而不是復制粘貼解決方案。

我相信這種情況正在發生,因為new_array每一行實際上都指向同一個精確列表line

像這樣更改你的代碼,它應該工作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM