为什么仍然给出类型错误?

时间:2018-07-30 11:07:34

标签: python typeerror magic-square

我正在制作一个python程序,以检查给定的值是否表示魔术平方

import math
r1=[8,1,6]
r2=[3,5,7]
r3=[4,9,2]
c1=zip(r1[:1],r2[:1],r3[:1])
c1= (list(c1))
c2=zip(r1[1:2],r2[1:2],r3[1:2])
c2=(list(c2))
c3=zip(r1[2:3],r2[2:3],r3[2:3])
c3= (list(c3))
print (c1,c2,c3)
print(type(c1),type(c2),type(c3))
t1=math.fsum(r1)
t2=math.fsum(r2)
t3=math.fsum(r3)
t4=math.fsum(c1)
t5=math.fsum(c2)
t6=math.fsum(c3)
print(t1,t2,t3,t4,t5,t6)
if(t1==t2==t3==t4==t5==t6):
    print ("yes")
else:
    print("no")

但是在行中     t4 = math.fsum(c1)

尽管t4的类型仅显示列表,但它给出类型错误。

3 个答案:

答案 0 :(得分:1)

c1变量中,有一个元组列表:[(8, 3, 4)]。您可以通过以下方式构造c1(及其他):c1 = [r1[0], r2[0], r3[0]]

但是我建议您将一个幻方存储在一个变量中,例如:magic = [[8, 1, 6], [3, 5, 7], [4, 9, 2]]。现在,您可以将第i行元素的总和作为sum(magic[i]),对于列,请尝试使用列表推导:

sum([magic[i][j] for i in range(3)])

其中j-列数。

答案 1 :(得分:0)

正如已经建议的那样,该zip返回一个元组,并使其成为列表,仅将相同的元组放入列表中,以下代码将执行您想要的

import math
r1=[8,1,6]
r2=[3,5,7]
r3=[4,9,2]
c1=r1[:1]+r2[:1]+r3[:1]
#c1= list(c1)
c2=r1[1:2]+r2[1:2]+r3[1:2]
#c2=(list(c2))
c3=r1[2:3]+r2[2:3]+r3[2:3]
#c3= (list(c3))
print (c1,c2,c3)
print(type(c1),type(c2),type(c3))
t1=math.fsum(r1)
t2=math.fsum(r2)
t3=math.fsum(r3)
t4=math.fsum(c1)
t5=math.fsum(c2)
t6=math.fsum(c3)
print(t1,t2,t3,t4,t5,t6)
if(t1==t2==t3==t4==t5==t6):
    print ("yes")
else:
    print("no")

输出将是:

[8, 3, 4] [1, 5, 9] [6, 7, 2]
<class 'list'> <class 'list'> <class 'list'>
15.0 15.0 15.0 15.0 15.0 15.0
yes

答案 2 :(得分:0)

将所有行存储在一个列表中作为列表列表。检查由该列表列表表示的数组是否是魔方会更容易

>>> r1=[8,1,6]
>>> r2=[3,5,7]
>>> r3=[4,9,2]
>>> arr = [r1, r2, r3]
>>> row_sum = set(map(sum, arr))
>>> col_sum = set(map(sum, zip(*arr)))
>>> if len(row_sum) == 1 and row_sum == col_sum:
        print ('Magic square')