2017-08-10 50 views
0

我想創建一個程序(對稱(p)),它需要一個列表,它必須是像Sudoku遊戲一樣的方形,並且其組件也是列表和輸出如果「方形」是對稱的,則值爲真或假。真正基本的數獨程序

如果第一行等同於第一列,第二行等同於第二列等,則正方形是對稱的。現在,我編寫了代碼,但它不起作用。其輸出始終爲真。這裏是代碼的粘貼:

def column_building(list, position): 
    column = [] 
    for i in list: 
    column.append(i[position]) 
    return column 

a = [[1, 2, 3], 
    [2, 3, 4], 
    [3, 4, 1]] 

b = [["cat", "dog", "fish"], 
    ["dog", "dog", "dog"], 
    ["fish","fish","cat"]] 

def symmetric(p): 
    counter = 0 
    for e in p: 
    if e == column_building(p, counter): 
     counter = counter + 1 
     return True 
    else: 
     return False 
     break 

print symmetric(b) 

在代碼中,第一個程序告訴哪一列是確定位置的列。 ab是我創建用作示例的列表。正如我所說的,它的輸出總是爲True,但如果我使用b,則e是列表的第二個元素,它不等於第二個位置構建的列([dog, dog, fish])。

回答

2

Python魔法!

def symmetric(p): 
    return list(map(list, zip(*p))) == p 

這裏,zip(*p)只是轉置列表的給定列表。其實你需要檢查是否有transpose(p) == p

如果您使用Python 2.7,則可以將外部呼叫移除到list

+1

是的,這是最好的答案+1。如果它是一個包含元組的列表,它將只是列表(zip(* b)),所以這可能是一個替代方案。 **列表(zip(* b))==列表(地圖(元組,b))** –

+0

感謝您的幫助!然而,因爲我是一個真正的初學者在這個python魔術(哈哈)我沒有學習這些功能,所以我必須排除沒有他們的活動。 –

-1

我相信,你需要檢查是否transpose(p) == p

+0

你在哪裏找到'轉置'功能? – ForceBru

+0

導入numpy爲np和:np.array(b)== np.array(b).T –

0

要修復(而不是取代)你的代碼,我建議:

def symmetric(p): 
    counter = 0 

    for e in p: 
     if e != column_building(p, counter): 
      return False 
     counter += 1 

    return True 

你是在錯誤的時間爲返回TrueFalse問題比你做得更簡單。

+0

感謝您修復它。現在,我還沒有學習枚舉這樣的函數,所以必須有一種方法可以讓代碼在沒有它的情況下工作,我想。除此之外,你會告訴我最初的代碼有什麼問題嗎?我的意思是,我知道這是錯誤的,因爲它不起作用,但我不明白爲什麼,我寫或試圖寫的基本上是:如果第一行等於第一列,則向計數器添加一個,返回確實,然後轉到p(list)中的下一個元素(列表),如果沒有,則返回False並結束循環。 –

+0

@PedroLopez,我已經更新了我的答案,使用原始計數器邏輯代替'enumerate()',它基本上做了同樣的事情。您的原始代碼錯誤,因爲您從循環中返回了「True」。如果* any *測試失敗,在循環過程中返回'False'是可以的,但是直到循環完成並且* all *測試成功,您才能知道它是否爲'True'。 – cdlane

+0

哦,好吧,非常感謝你! –

0

numpy的版本:

import numpy as np 

b = [["cat", "dog", "fish"], 
["dog", "dog", "dog"], 
["fish","fish","cat"]] 

np.all(np.array(b) == np.array(b).T) # all True = True, else False