鱼C论坛

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

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

[复制链接]
发表于 2020-3-22 14:31:15 | 显示全部楼层
本帖最后由 mdphd 于 2020-3-22 14:34 编辑
a = [[1,2,3,4],
     [5,1,2,3],
     [9,5,1,2],
    ]
def f356(a):
    if len(a) <= len(a[0]):
        b = a
    else:
        def transformMatrix(m):
            r = [[] for i in m[0]]
             
            for ele in m:
                for i in range(len(ele)):
                    r[i].append(ele[i])
            return r
        b = transformMatrix(a)
    M, N = len(b), len(b[0])
    c = 1
    for i in range(1, M - 1):
        for j in range(1, i + 1):
            if b[M - 1 - j][i - j] != b[M - 1][i]:                
                c = 0
                break
        if c == 0:
            print("False")
            break
    if c == 1:
        for i in range(M - 1, N):
            for j in range(1, M):
                if b[M -1 -j][i - j] != b[M - 1][i]:
                    c = 0
                    break
            if c == 0:
                print("False")
                break
    if c == 1:
        for i in range(1, M - 1):
            for j in range(1, M - i):
                if b[M - 1 - i - j][N - 1 - j] != b[M - 1 - i][N - 1]:
                    c = 0
                    break
            if c == 0:
                print("False")
                break
    if c == 1:
        print("True")
f356(a)     
没仔细想,这个方法很差,前面的大佬确实厉害!

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-22 15:37:10 | 显示全部楼层
def f356(list1):
    lenth=len(list1)
    width=len(list1[0])
    if lenth==width==0:
        return True
    for i in range(width-1):
        for j in range(lenth-1,0,-1):
            if list1[j-1][i]==list1[j][i+1]:
                continue
            else:
                return False
    for j in  range(lenth-1):
        for i in range(width-1,0,-1):
            if list1[j+1][i]==list1[j][i-1]:
                continue
            else:
                return False
    return True
#

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-22 16:14:11 | 显示全部楼层    本楼为最佳答案   
尝试一行代码
def f356(x):
    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 编辑
def f356(M:list)->bool:
    if len(M)>1:
        for i in range(len(M)-1):
            if M[i][:-1]!=M[i+1][1:]:
                return False
        return True
    elif len(M)==1 and len(M[0])!=0:
        return True
    else:
        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 | 显示全部楼层
def f(list1):
    m = len(list1)
    n = len(list1[0])
    list2 = []
    for a in range(m):
        list2.append([0 for b in range(n)])

    list2[0] = list1[0]

    for d in range(1,m):
        for e in range(0,n):
            if e == 0:
                list2[d][e] = list1[d][e]
            else:
                list2[d][e] = list2[d-1][e-1]

    if list2 == list1:
        return True
    else:
        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
org_list1 = [[1, 2, 3, 4],[5, 1, 2, 3],[9, 5, 1, 2]]
org_list2 = [[1, 2],[2, 2]]

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

def q356(org_list):
    copy_list = org_list[:]

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

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

    count = max(demo) - min(demo)
    
    if demo[0] > min(demo):
        #行数大于列数,进行行切片操作
        num = demo[1]
        i = 0
        while i < count + 1:
            mat1 = org_mat[i:num+i]         #行切片操作            
            mat2 = fliplr(mat1)               #镜像矩阵
            mat5_1 = hstack((mat1,mat2))
            mat3 = mat1.T                     #转置矩阵
            mat4 = fliplr(mat3)
            mat5_2 = hstack((mat4,mat3))
            mat5 = vstack((mat5_2,mat5_1))  #矩阵合并,列合并:vstack,行合并:hstack
            if (mat5 == mat5.T).all():
                i += 1
                continue
            else:
                return False
        return True
        
    else:
        #列数大于行数,进行列切片操作
        num = demo[0]
        i = 0
        while i < count + 1:
            mat1 = org_mat[:,i:num+i]       #列切片操作
            mat2 = fliplr(mat1)               #镜像矩阵
            mat5_1 = hstack((mat1,mat2))
            mat3 = mat1.T                     #转置矩阵
            mat4 = fliplr(mat3)
            mat5_2 = hstack((mat4,mat3))
            mat5 = vstack((mat5_2,mat5_1))  #矩阵合并,列合并:vstack,行合并:hstack
            if (mat5 == mat5.T).all():
                i += 1
                continue
            else:
                return False
        return True


if __name__ == '__main__':
    print(q356(org_list1))
    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]] 出错

已更改
def fun356(arr):
    M = len(arr)
    N = len(arr[0])
    if M < N:
        for i in range(0,N-M+1):
            head = arr[0][i]
            for x in range(1,M):
                if head != arr[x][x+i]:
                    return False
        for i in range(N-M+1,N):
            head = arr[0][i]
            for x in range(1,N-i):
                if head != arr[x][x+i]:
                    return False
        for j in range(1,M):
            head = arr[j][0]
            for y in range(1,M-j):
                if head != arr[y+j][y]:
                    return False
    else:
        for j in range(0,M-N+1):
            head = arr[j][0]
            for y in range(1,N):
                if head != arr[y+j][y]:
                    return False
        for j in range(M-N+1,M):
            head = arr[j][0]
            for y in range(1,M-j):
                if head != arr[y+j][y]:
                    return False
        for i in range(1,N):
            head = arr[0][i]
            for x in range(1,N-i):
                if head != arr[x][x+i]:
                    return False
    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, 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-11-25 15:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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