python习题总结(10)——矩阵非常规打印

'''
10、打印矩阵外圈
1	2	6	7
3	5	8	13
4	9	12	14
10	11	15	16
打印顺序为1,2,6,7,13,14,16,15,11,10,4,3
挑战题:
打印矩阵元素
1	2	6	7   15
3	5	8	14  16 
4	9	13	17  22
10	12	18	21  23
11  19  20  24  25
之字形打印结果为1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
'''
lst = [[1,2,6,7,15],
[3,5,8,14,16], 
[4,9,13,17,22],
[10,12,18,21,23],
[11,19,20,24,25]]
#打印外圈,方阵,索引有对称规律,长度确定,打印一半即可
line = [0]*(2*len(lst[0]) + 2 * (len(lst)-2))         
line[0] = lst[0][0]                ##line[index] :00 01 02 03 13 23 33 32 31 30 20 10                           
index = 1
for i in range(len(lst)):
    for j in range(1,len(lst[0])):
        if i == 0:
            line[index] = lst[i][j]
            line[-index] = lst[j][i]
            index += 1
        elif j == len(lst[0])-1:
            line[index] = lst[i][j]
            line[-index] = lst[j][i] 
            index += 1
print('口:',line)
##之字,规律好找,没效率!!!
zline = []
row = len(lst)
cont = 0
for i in range(2*row-1):
    if not i & 1:
        for j in range(row-1,-1,-1):
            for k in range(row):
                cont += 1
                if j + k == i:
                    zline.append(lst[j][k])
    else:
        for j in range(row):
            for k in range(row-1,-1,-1):
                cont += 1
                if j + k == i:
                    zline.append(lst[j][k])
print(zline,cont)
##之字,边间不好找,效率高,非方阵不适用
zline = []
cont = 0
for i in range(2*row-1):            #00 01 10 20 11 02 03 12 21 30 31 22 13 23 32 33
    if i < row :
        for j in range(i+1):
            cont += 1
            if not i & 1:
                zline.append(lst[i-j][j])
            else:
                zline.append(lst[j][i-j])
    else:
        for j in range(i-row+1,row):
            cont += 1
            if not i & 1:
                zline.append(lst[i-j][j])
            else:
                zline.append(lst[j][i-j])
print('之:',zline,cont)
##之字,将数组变成另一数组,通过索引,先拿到数据,再按不同方向输出,适用与非方阵
lst = [[1,2,6,7],
      [3,5,8,14], 
      [4,9,13,17],
      [10,12,18,21],
      [11,19,20,24]]
zline1 = [ [] for i in range((len(lst)+len(lst[0])-1))]
index = 0
for i in range(len(lst)):
    for j in range(len(lst[0])):
        zline1[index].append(lst[i][j])
        index += 1
        if j == len(lst[0])-1:
            index = i + 1
print(zline1)
for i,row in enumerate(zline1):
    if not i&1:
        print(' '.join(map(str,reversed(row))),end = ' ')
    else:
        print(' '.join(map(str,row)),end = ' ')
#回字打印,函数每一次收集外圈(控制索引实现),把里面的矩阵(矩阵切片用zip)递归调用函数,数据存在默认值中
def mouth(lst,nums = []):
    if lst == []: return nums
    if len(lst) == 1 and len(lst[0]) == 1: return nums + [lst[0][0]]
    i = 0
    stepi = 0
    j = 0
    stepj = 0
    flag,flag1,flag2 = False,False,False
    for k in range(2*len(lst)+2*len(lst[0])-4):
        nums.append(lst[i][j])
        if i == 0:
            stepi = 0
            stepj = 1
            if j == len(lst[0])-1: flag = True
        if flag:
            stepi = 1
            stepj = 0
            if i == len(lst)-1:
                flag1 = True
                flag = False
        if flag1:
            stepi = 0
            stepj = -1
            if j == 0:
                flag2 = True
                flag1 = False
        if flag2:
            stepi = -1
            stepj = 0
        i += stepi
        j += stepj
    return mouth(list(zip(*list(zip(*lst[1:len(lst)-1]))[1:len(lst[0])-1])),nums)
lst = [[1, 2, 3, 4, 5],
      [16,17,18,19, 6],
      [15,24,25,20, 7],
      [14,23,22,21, 8],
      [13,12,11,10, 9]]
lst1 = [[1,2,3,4],
       [12,13,14,5],
       [11,16,15,6],
       [10,9,8,7]]
print(mouth(lst))

猜你喜欢

转载自blog.csdn.net/qq_33287645/article/details/79943478
今日推荐