我已经用python编写了字母表的rangoli代码,并希望得到它的审查。其目标是打印由字母组成的同心钻石形状,中心是"a“,"b”形成下一层,然后是"c“等等。
任何关于使其更符合逻辑或更简洁的意见,将不胜感激。
import math
# input the size of alphabet rang oli
def print_rangoli(size):
totalHeight = (2 * size) - 1
totalWidth = (2 * totalHeight) - 1
numberOfAlphabets = 1
numberOfDashes = (totalWidth - numberOfAlphabets) // 2
# initialize a list of alphabets
alphabets = "a b c d e f g h i j k l m n o p q r s t u v w x y z".split(" ")
# run a for loop totalHeight number of times
for i in range(1, totalHeight + 1):
if i <= math.ceil(totalHeight / 2):
print("-" * numberOfDashes, end="")
listIndex = size - 1
for k in range(math.ceil(numberOfAlphabets / 2)):
if size == 1:
print(alphabets[listIndex])
else:
print(alphabets[listIndex] + "-", end="")
listIndex -= 1
listIndex += 1
for k in range(math.floor(numberOfAlphabets / 2)):
listIndex += 1
if i == math.ceil(totalHeight / 2) and k == math.floor(numberOfAlphabets / 2) - 1:
print(alphabets[listIndex], end="")
else:
print(alphabets[listIndex] + "-", end="")
print("-" * (numberOfDashes - 1))
if i != math.ceil(totalHeight / 2):
numberOfAlphabets += 2
numberOfDashes -= 2
else:
numberOfDashes += 2
numberOfAlphabets -= 2
print("-" * numberOfDashes, end="")
listIndex = size - 1
for k in range(math.ceil(numberOfAlphabets / 2)):
print(alphabets[listIndex] + "-", end="")
listIndex -= 1
listIndex += 1
for k in range(math.floor(numberOfAlphabets / 2)):
listIndex += 1
print(alphabets[listIndex] + "-", end="")
print("-" * (numberOfDashes - 1))
if __name__ == "__main__":
size = int(input())
print_rangoli(size)发布于 2022-05-06 01:39:23
您可以将代码简化很多。
第一个简单的改变是您不需要这样定义字母表:
字母= "a b,c,d,e,g,h,i,j,k,L m,n,p,q,r,S,t,u,v,w,y,z“,.split(”")
如果将字符串视为可索引的,则代码将运行得很好:
alphabets = "abcdefghijklmnopqrstuvwxyz"进一步简化,您可以利用内置模块:
from string import ascii_lowercase as alphabets您可以使用"-"作为左填充、右填充和内部填充,而不是繁琐地确定将这些字符放置在何处,而可以使用str.center(width, '-')来填充,而使用'-'.join('cbabc')来获取"c-b-a-b-c"。把这两种技术结合起来,你就可以写
print('-'.join('cbabc').center(11, '-'))…获得
--c-b-a-b-c--计算numberOfDashes和numberOfAlphabets不需要做那么多的运算。我只需要将中间行组合成一个字符串,然后调用len(…)让Python告诉您布局必须有多宽。
按照您构建代码的方式,您有四种情况:if i <= math.ceil(totalHeight / 2):用来测试您是在上半部分还是下半部分,对于每一种情况,一个for k in …循环处理左侧,另一个for k in …循环处理右侧。
我建议使用abs()函数来帮助您执行对称迭代,而不是所有这些。
from string import ascii_lowercase
def seq(n, i):
return '-'.join(
ascii_lowercase[i + abs(j)]
for j in range(i - n, n - i + 1)
)
def rangoli(n):
width = len(seq(n, 0)) # Pad everything to match the width of the center row
return '\n'.join(
seq(n, abs(i)).center(width, '-')
for i in range(-n, n + 1)
)
if __name__ == "__main__":
size = int(input())
print(rangoli(size - 1))发布于 2022-05-05 18:41:05
为了打印所有行,您可以使用两个周期:
为了打印一行,您可以注意到:
在这种情况下,您可以做的是首先生成内容(letters+spaces),然后使用Python操作生成您的join行:
# input the size of alphabet rang oli
def print_rangoli(size):
alphabet = "abcdefghijklmnopqrstuvwxyz"
# extracting letters to use from alphabet
letters = alphabet[:size]
# variables used in the cycles
dashes = ''
content = ''
# generating first half
for i in range(1, size+1, 1):
dashes = '-'*(size-i)
content = letters[:i][::-1] + letters[1:i]
print('-'.join(dashes + content + dashes))
# generating second half
for i in range(size-1, 0, -1):
dashes = '-'*(size-i)
content = letters[:i][::-1] + letters[1:i]
print('-'.join(dashes + content + dashes))
if __name__ == "__main__":
size = int(input())
print_rangoli(size)此解决方案还处理与大小范围域0,26相关的边缘情况。如果您想处理与size <0或size > 26相关的情况,可以在函数开始时进行一些检查。
https://codereview.stackexchange.com/questions/276328
复制相似问题