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
x2*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。谢谢你提供了不同类型的解决方案!和另一个答案一样,当一行不是简单的列表理解时,它很少是可读的。谢谢你的帮助!这很有效。谢谢!