Python 模式程序.矩阵字母模式

Python 模式程序.矩阵字母模式,python,Python,尝试制作矩阵字母表模式。所需的输出应如下所示: DDDDDDD DCCCCCD DCBBBCD DCBABCD DCBBBCD DCCCCCD DDDDDDD 我找到了矩阵编号模式的解决方案: 投入:4 N = int(input('Enter N value:')) k = (2 * N) - 1 low = 0 high = k - 1 value = N matrix = [[0 for i in range(k)] for j in range(k)] for i in range(N

尝试制作矩阵字母表模式。所需的输出应如下所示:

DDDDDDD
DCCCCCD
DCBBBCD
DCBABCD
DCBBBCD
DCCCCCD
DDDDDDD
我找到了矩阵编号模式的解决方案:

投入:4

N = int(input('Enter N value:'))
k = (2 * N) - 1
low = 0
high = k - 1
value = N
matrix = [[0 for i in range(k)] for j in range(k)]
for i in range(N):
    for j in range(low, high + 1):
        matrix[i][j] = value
    for j in range(low + 1, high + 1):
        matrix[j][i] = value
    for j in range(low + 1, high + 1):
        matrix[high][j] = value
    for j in range(low + 1, high):
        matrix[j][high] = value

    low = low + 1
    high = high - 1
    value = value - 1

for i in range(k):
    for j in range(k):
        print(matrix[i][j], end =' ')
    print()
输出:

4 4 4 4 4 4 4 
4 3 3 3 3 3 4 
4 3 2 2 2 3 4 
4 3 2 1 2 3 4 
4 3 2 2 2 3 4 
4 3 3 3 3 3 4 
4 4 4 4 4 4 4 

不确定此矩阵数字模式代码是否是最平滑的解决方案。

似乎您只需要将数字转换为大写字母,也不需要额外的变量
low
value
,只需使用现有的
N
i

from string import ascii_uppercase # simple string of all alphabet

N = int(input('Enter N value:'))
k = (2 * N) - 1
high = k - 1
matrix = [[0 for _ in range(k)] for _ in range(k)]

for i in range(N):
    for j in range(i, high + 1):
        matrix[i][j] = N - i
    for j in range(i + 1, high + 1):
        matrix[j][i] = N - i
    for j in range(i + 1, high + 1):
        matrix[high][j] = N - i
    for j in range(i + 1, high):
        matrix[j][high] = N - i

    high = high - 1
    
for i in range(k):
    for j in range(k):
        print(ascii_uppercase[matrix[i][j] - 1], end='')
    print()

我们可以在一条输入线和一条输出线中解决所有问题:

N = int(input('Enter N value:'))
print('\n'.join([''.join([chr(64+max(max(N-i,N-j),max(i-N+2,j-N+2))) for i in range(2*N-1)]) for j in range(2*N-1)]))
说明: 我们将在这个
2*N-1
x
2*N-1
网格中工作,现在使用零:

[[0 for i in range(2*N-1)] for j in range(2*N-1)]
然后,我们需要格式化,所以我们将事物转换为字符串并连接它们:

print('\n'.join([''.join([str(0) for i in range(2*N-1)]) for j in range(2*N-1)]))
好的,我们有零,但是我们需要你的数字矩阵,所以我们将这个公式应用于索引为max(max(N-i,N-j),max(i-N+2,j-N+2)的矩阵

现在我们有了数字矩阵,让我们应用这个转换:chr(64+k)=>字母表的大写字母,从零开始,因为
'A'
是ascii码
64
,'B'是ascii码
65
,等等

print('\n'.join([''.join([chr(64+max(max(N-i,N-j),max(i-N+2,j-N+2))) for i in range(2*N-1)]) for j in range(2*N-1)]))

这就是它。

将其视为距矩阵中心的距离,并带有偏移量

[[int(max(abs((n-1)/2-i),abs((n-1)/2-j)))+1 for i in range(n)] for j in range(n)]

[[4, 4, 4, 4, 4, 4, 4],
 [4, 3, 3, 3, 3, 3, 4],
 [4, 3, 2, 2, 2, 3, 4],
 [4, 3, 2, 1, 2, 3, 4],
 [4, 3, 2, 2, 2, 3, 4],
 [4, 3, 3, 3, 3, 3, 4],
 [4, 4, 4, 4, 4, 4, 4]]
这里n是奇数,矩阵的中心是(n-1)/2。由于您希望在中间添加一个“1”作为偏移量,因此除法将数字转换为浮点格式,因此int()可以获得良好的格式。列表理解可以转换为嵌套循环,但这种方式似乎很好,因为它消除了矩阵初始化步骤

该距离称为切比雪夫距离(或棋盘距离)

要将矩阵转换为字符串数组,请将数字转换为相应的字符并将行连接起来。此时可读性失败

[''.join([chr(ord('A')+int(max(abs((n-1)/2-i),abs((n-1)/2-j)))) for i in range(n)]) for j in range(n)]

['DDDDDDD', 'DCCCCCD', 'DCBBBCD', 'DCBABCD', 'DCBBBCD', 'DCCCCCD', 'DDDDDDD']
使用函数

def chebDist(i,j,n):
    return int(max(abs((n-1)/2-i),abs((n-1)/2-j)))

def toChar(d):
    return chr(ord('A')+d-1) 

[''.join([toChar(chebDist(i,j,n)+1) for i in range(n)]) for j in range(n)]
我会给你

['DDDDDDD', 'DCCCCCD', 'DCBBBCD', 'DCBABCD', 'DCBBBCD', 'DCCCCCD', 'DDDDDDD']
或者这种格式

print('\n'.join([''.join([toChar(chebDist(i,j,n)+1) for i in range(n)]) for j in range(n)]))

DDDDDDD
DCCCCCD
DCBBBCD
DCBABCD
DCBBBCD
DCCCCCD
DDDDDDD
可读性和可重用的功能

def chebDist(i,j,n):
    return int(max(abs((n-1)/2-i),abs((n-1)/2-j)))

def toChar(d):
    return chr(ord('A')+d-1) 

[''.join([toChar(chebDist(i,j,n)+1) for i in range(n)]) for j in range(n)]
您也许可以通过分离转换使其更具可读性,折衷是由于中间值而提高了效率

首先创建数值矩阵

m=[[chebDist(i,j,n)+1 for i in range(n)] for j in range(n)]
转换为字符映射

c=[[toChar(e) for e in row] for row in m]
转换为字符串表示并打印

print('\n'.join([''.join(row) for row in c]))
更新

最后,所有这些都被包装成4个通用函数和2行代码

def chebDist(i,j,n):
    return int(max(abs((n-1)/2-i),abs((n-1)/2-j)))

def toChar(d):
    return chr(ord('A')+d-1) 

def map2(f,m):
    return [[f(e) for e in row] for row in m]

def toString(a):
    return '\n'.join(map(''.join,a))


m=[[chebDist(i,j,n)+1 for i in range(n)] for j in range(n)]
print(toString(map2(toChar,m)))

你需要把数字转换成字母?是的,我不知道怎么做。这能回答你的问题吗?这是我解决问题的最后一步
chr(64+matrix[i][j])
在打印循环中,您可以使用ascii字符。您好,现在您已经有了答案,您可以考虑奖励给您最有用意见的人。为什么我因为提出了不同的解决方案而被否决?我真的很喜欢没有fors的代码,这对我来说似乎有点像蟒蛇。我没有投否决票,但我可以猜:否决票可能是针对“无效”的答案,有不同的标准,这里OP似乎还在学习,你的解决方案不适合他的水平,甚至对我这个经常编码的人来说,我从来没有写过这样一个不可读的代码,我投了反对票,因为像这样复杂的一行程序是非常糟糕的做法,OP显然是个初学者。我注意到你在编辑中解释了你的答案,但我的观点仍然站得住脚。不管你怎么想,凌乱的一行代码显然不是Pythonic。谢谢你提供了不同类型的解决方案!和另一个答案一样,当一行不是简单的列表理解时,它很少是可读的。谢谢你的帮助!这很有效。谢谢!