鱼C论坛

 找回密码
 立即注册
楼主: zltzlt

[已解决]Python:每日一题 356

[复制链接]
发表于 2020-3-22 14:31:15 | 显示全部楼层
本帖最后由 mdphd 于 2020-3-22 14:34 编辑
  1. a = [[1,2,3,4],
  2.      [5,1,2,3],
  3.      [9,5,1,2],
  4.     ]
  5. def f356(a):
  6.     if len(a) <= len(a[0]):
  7.         b = a
  8.     else:
  9.         def transformMatrix(m):
  10.             r = [[] for i in m[0]]
  11.             
  12.             for ele in m:
  13.                 for i in range(len(ele)):
  14.                     r[i].append(ele[i])
  15.             return r
  16.         b = transformMatrix(a)
  17.     M, N = len(b), len(b[0])
  18.     c = 1
  19.     for i in range(1, M - 1):
  20.         for j in range(1, i + 1):
  21.             if b[M - 1 - j][i - j] != b[M - 1][i]:               
  22.                 c = 0
  23.                 break
  24.         if c == 0:
  25.             print("False")
  26.             break
  27.     if c == 1:
  28.         for i in range(M - 1, N):
  29.             for j in range(1, M):
  30.                 if b[M -1 -j][i - j] != b[M - 1][i]:
  31.                     c = 0
  32.                     break
  33.             if c == 0:
  34.                 print("False")
  35.                 break
  36.     if c == 1:
  37.         for i in range(1, M - 1):
  38.             for j in range(1, M - i):
  39.                 if b[M - 1 - i - j][N - 1 - j] != b[M - 1 - i][N - 1]:
  40.                     c = 0
  41.                     break
  42.             if c == 0:
  43.                 print("False")
  44.                 break
  45.     if c == 1:
  46.         print("True")
  47. f356(a)     
复制代码

没仔细想,这个方法很差,前面的大佬确实厉害!

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 15:37:10 | 显示全部楼层
  1. def f356(list1):
  2.     lenth=len(list1)
  3.     width=len(list1[0])
  4.     if lenth==width==0:
  5.         return True
  6.     for i in range(width-1):
  7.         for j in range(lenth-1,0,-1):
  8.             if list1[j-1][i]==list1[j][i+1]:
  9.                 continue
  10.             else:
  11.                 return False
  12.     for j in  range(lenth-1):
  13.         for i in range(width-1,0,-1):
  14.             if list1[j+1][i]==list1[j][i-1]:
  15.                 continue
  16.             else:
  17.                 return False
  18.     return True
  19. #
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 16:14:11 | 显示全部楼层    本楼为最佳答案   
尝试一行代码
  1. def f356(x):
  2.     return sum([x[i][:-1]!=x[i+1][1:] for i in range(len(x)-1)])==0 if len(x)>1 else True if len(x)==1 and len(x[0])!=0 else False
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 16:26:45 | 显示全部楼层
本帖最后由 ouyunfu 于 2020-3-22 23:46 编辑
  1. def f356(M:list)->bool:
  2.     if len(M)>1:
  3.         for i in range(len(M)-1):
  4.             if M[i][:-1]!=M[i+1][1:]:
  5.                 return False
  6.         return True
  7.     elif len(M)==1 and len(M[0])!=0:
  8.         return True
  9.     else:
  10.         return '请输入非空矩阵'
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
zltzlt + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 16:58:00 | 显示全部楼层
l= [
  [1, 2, 3, 4],
  [5, 1, 2, 3],
  [9, 5, 1, 2],
]

k=[
  [1, 2],
  [2, 2]
]

def fun356(l):
  n = len(l)
  m = len(l[0])
  active = 1
  for i in range(n-1):
    for j in range(m-1):
      if (l[i][j] != l[i+1][j+1]):
        active = 0
        break
    if active == 0:
      break
  if active:
    print("True")
  else:
    print("False")
  return active

print(l)
fun356(l)
print(k)
fun356(k)

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-22 17:37:30 | 显示全部楼层
dch_python 发表于 2020-3-22 09:36
弱弱的问一下如果要输入矩阵格式的是不是应该先导入Pandas(本人萌新)。。。看到前面回复的鱼油都直接用matr ...

不用 pandas
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 17:39:33 | 显示全部楼层
  1. def f(list1):
  2.     m = len(list1)
  3.     n = len(list1[0])
  4.     list2 = []
  5.     for a in range(m):
  6.         list2.append([0 for b in range(n)])

  7.     list2[0] = list1[0]

  8.     for d in range(1,m):
  9.         for e in range(0,n):
  10.             if e == 0:
  11.                 list2[d][e] = list1[d][e]
  12.             else:
  13.                 list2[d][e] = list2[d-1][e-1]

  14.     if list2 == list1:
  15.         return True
  16.     else:
  17.         return False
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-22 17:43:58 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-22 17:44:30 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-22 17:45:15 | 显示全部楼层

输入 [[58, 25, 63], [30, 58, 25], [90, 30, 58]] 出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-22 17:48:43 | 显示全部楼层
flamezyy 发表于 2020-3-21 21:24
不确定[[1,2]]和[[1],[2]]这种怎么算,就当是False来处理了

108 ms
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 19:03:40 | 显示全部楼层
解题思路:
图片1.png
  1. org_list1 = [[1, 2, 3, 4],[5, 1, 2, 3],[9, 5, 1, 2]]
  2. org_list2 = [[1, 2],[2, 2]]

  3. from numpy import *   #调用numpy模块,将数据转换成矩阵进行运算

  4. def q356(org_list):
  5.     copy_list = org_list[:]

  6.     org_mat = mat(copy_list)
  7.     demo = (org_mat.shape)

  8.     #当矩阵行列中有一个为1时候,判定为TRUE
  9.     if min(demo) == 1:
  10.         return True

  11.     count = max(demo) - min(demo)
  12.    
  13.     if demo[0] > min(demo):
  14.         #行数大于列数,进行行切片操作
  15.         num = demo[1]
  16.         i = 0
  17.         while i < count + 1:
  18.             mat1 = org_mat[i:num+i]         #行切片操作            
  19.             mat2 = fliplr(mat1)               #镜像矩阵
  20.             mat5_1 = hstack((mat1,mat2))
  21.             mat3 = mat1.T                     #转置矩阵
  22.             mat4 = fliplr(mat3)
  23.             mat5_2 = hstack((mat4,mat3))
  24.             mat5 = vstack((mat5_2,mat5_1))  #矩阵合并,列合并:vstack,行合并:hstack
  25.             if (mat5 == mat5.T).all():
  26.                 i += 1
  27.                 continue
  28.             else:
  29.                 return False
  30.         return True
  31.         
  32.     else:
  33.         #列数大于行数,进行列切片操作
  34.         num = demo[0]
  35.         i = 0
  36.         while i < count + 1:
  37.             mat1 = org_mat[:,i:num+i]       #列切片操作
  38.             mat2 = fliplr(mat1)               #镜像矩阵
  39.             mat5_1 = hstack((mat1,mat2))
  40.             mat3 = mat1.T                     #转置矩阵
  41.             mat4 = fliplr(mat3)
  42.             mat5_2 = hstack((mat4,mat3))
  43.             mat5 = vstack((mat5_2,mat5_1))  #矩阵合并,列合并:vstack,行合并:hstack
  44.             if (mat5 == mat5.T).all():
  45.                 i += 1
  46.                 continue
  47.             else:
  48.                 return False
  49.         return True


  50. if __name__ == '__main__':
  51.     print(q356(org_list1))
  52.     print(q356(org_list2))
复制代码
输出结果:True
                  False

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
zltzlt + 4 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 20:19:58 | 显示全部楼层
zltzlt 发表于 2020-3-22 17:45
输入 [[58, 25, 63], [30, 58, 25], [90, 30, 58]] 出错

已更改
  1. def fun356(arr):
  2.     M = len(arr)
  3.     N = len(arr[0])
  4.     if M < N:
  5.         for i in range(0,N-M+1):
  6.             head = arr[0][i]
  7.             for x in range(1,M):
  8.                 if head != arr[x][x+i]:
  9.                     return False
  10.         for i in range(N-M+1,N):
  11.             head = arr[0][i]
  12.             for x in range(1,N-i):
  13.                 if head != arr[x][x+i]:
  14.                     return False
  15.         for j in range(1,M):
  16.             head = arr[j][0]
  17.             for y in range(1,M-j):
  18.                 if head != arr[y+j][y]:
  19.                     return False
  20.     else:
  21.         for j in range(0,M-N+1):
  22.             head = arr[j][0]
  23.             for y in range(1,N):
  24.                 if head != arr[y+j][y]:
  25.                     return False
  26.         for j in range(M-N+1,M):
  27.             head = arr[j][0]
  28.             for y in range(1,M-j):
  29.                 if head != arr[y+j][y]:
  30.                     return False
  31.         for i in range(1,N):
  32.             head = arr[0][i]
  33.             for x in range(1,N-i):
  34.                 if head != arr[x][x+i]:
  35.                     return False
  36.     return True
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-22 20:58:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-22 20:59:28 | 显示全部楼层
TJBEST 发表于 2020-3-21 22:26
我临时想到的一个方法,不过和第一个方法我不太清楚 谁更快。就是说不太清楚python的序列相等运算内部如何 ...

136 ms
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-22 20:59:34 | 显示全部楼层
fan1993423 发表于 2020-3-21 22:37
这种呢 [[1,2]]是True还是False


True 和 False 都没关系
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-22 21:00:46 | 显示全部楼层

解答错误

输入:
  1. [[1, 2, 3, 4], [5, 1, 2, 3], [9, 5, 1, 2]]
复制代码

输出:False
预期结果:True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-22 21:02:04 | 显示全部楼层
suchocolate 发表于 2020-3-22 10:04
解题思路:
1.实际要循环的只有绿色区

第 4 行的 a 是 ls 吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-22 21:02:32 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-22 21:02:46 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-3-22 12:19
楼主没有加专辑!@zltzlt

加了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-1 22:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表