2015-11-19 45 views
1

我試圖反映對稱組的所有排列的平方。 正方形的「座標」用作字典中的鍵。現在假設值 沿着x軸反射。但由於某種原因 .pop()只想接受整數?我認爲它接受任何不包含不可變的類型,並且如果鍵不在字典中,則會引發KeyError。這是我的代碼:Python3類型錯誤dict.pop

def y_reflection(insquare): 
    """Function that reflects a square against it's y axis: 
       <----- reflection 

          --> x 
    n n-1 ... 2 1 | 1 2 ... n-1 n 
    n-1 n-2 ... 1 n | | n 1 ... n-2 n-1 
    ............... | v ................ 
    2 1 ... 4 3 | y 3 4 ... 1 2 
    1 n ... 3 2 | 2 3 ... n 1""" 

    for y in range (0, SQUARE_SIZE()): 
     for x in range (0, SQUARE_SIZE()): 
      insquare[(y,x)]=insquare.pop((y,(SQUARE_SIZE()-x))) 
    return insquare 

    insquare[(x,y)]=insquare.pop((x,(SQUARE_SIZE()-y))) 
TypeError: 'tuple' object cannot be interpreted as an integer 

任何想法是怎麼回事?

+0

到底是什麼'SQUARE_SIZE'?和'insquare'? – shuttle87

+0

SQUARE_SIZE是n。軸的長度。 Insquare是我描述的字典。它只是座標(x,y)作爲鍵和值0 Elias

回答

1

你絕對相信insquaredict?如果insquarelist,那麼這是錯誤。

附註:您將在此代碼中重新計算SQUARE_SIZE();一次爲外部range(不是問題),然後SQUARE_SIZE()次爲內部range,然後SQUARE_SIZE() ** 2次爲內部循環的主體。即使SQUARE_SIZE()返回一個常量值,簡單地調用函數的開銷可能會成爲運行時的主要因素。如果SQUARE_SIZE()有副作用,那麼您會調用它們很多。爲了避免許多不必要的range創作,SQUARE_SIZE()電話,並UNNEST循環,你可能想import itertools和改變這樣的事情在你的函數:

sqsize = SQUARE_SIZE() 
for y, x in itertools.product(range(sqsize), repeat=2): 
    # I removed a bunch of unnecessary parens here as well 
    insquare[y, x]=insquare.pop((y, sqsize - x)) 
return insquare 
+0

這只是我定義常量的方法。因爲我不想讓這個值弄亂,但是除非你使用函數,否則在python3中永遠無法確定。但它只是一直返回相同的值。 – Elias

+0

是的,insquare不是一個字典,因爲我從錯誤的地方打電話,沒有注意到。 – Elias

+1

@Elias:除了函數沒有更安全之外。他們仍然可以替換函數而不是函數內的常量。你不會包裝更好;這是相同的保護(或者缺乏; Python假設我們都是成年人,實際上並沒有保護它,這就是'CAPS_WITH_UNDERSCORES'的名字;告訴人們不要改變它),它會更快仍然是全局查找,但沒有函數調用開銷)。 – ShadowRanger

-1

我認爲錯誤是:

insquare[(x,y)] 

這個:(x,y)是一個元組。

+0

這實際上不是'dict'的錯誤。一個'dict'可以在'tuple'上鍵入就好了。甚至不需要parens; 'insquare [x,y]'的功能完全相同。 – ShadowRanger

+0

你是對的,沒有讀'insquare'是一個字典,我認爲它是一個列表。 –

0

我測試了你的代碼。該錯誤不在該函數內。錯誤是您定義insquare的地方。並從錯誤的外觀,你需要檢查你是否傳遞一個字典。我試着用下面的代碼和它的作品完美..

def y_reflection(insquare): 
    """Function that reflects a square against it's y axis: 
       <----- reflection 

          --> x 
    n n-1 ... 2 1 | 1 2 ... n-1 n 
    n-1 n-2 ... 1 n | | n 1 ... n-2 n-1 
    ............... | v ................ 
    2 1 ... 4 3 | y 3 4 ... 1 2 
    1 n ... 3 2 | 2 3 ... n 1""" 

    for y in range (0, 1): 
     for x in range (0, 1): 
      insquare[(y,x)]=insquare.pop((y,(1-x))) 
    return insquare 

    insquare[(x,y)]=insquare.pop((x,(1-y))) 

d = { 
     (0,0): 0, 
     (0,1): 1, 
     (1,0): 1, 
     (1,1): 0 
    } 
print (y_reflection(d)) 

測試環節 - https://repl.it/B1kZ/1