2017-08-10 28 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