对于编程非常陌生,对于Python还是非常陌生,我在线上承担着不同的任务。目标是在不依赖外部库的情况下完成很多工作。
我今天不能做的一个任务是:
给出街道名称和用户提供的号码,创建一个表user_provided_number列并输出街道名称。然后,在同一表中创建相同的输出,但反转街道地址。街道地址之间的空格应替换为“ |”。如果街道名称太短而无法完成该行,则呈现“?”每个剩余的空间。
方案示例:
街道地址:Mystreet路,用户提供的电话号码:6
预期输出:
M y s t r e
e t | r o a
d | d a o r
| t e e r t
s y M ? ? ?
到目前为止,我已经做到了以下几点:
strAddress = input("What's your street address?")
givenNumber = input("What's your favourite number from 1 to 10?")
reverseAddress = strAddress[::-1]
splitAddress = list(strAddress)
for row in range(0,int(len(strAddress)/givenNumber)):
for element in range(0,givenNumber):
print (splitAddress[element], end=' ')
print()
为什么这个“数组”(?)在每一行上打印相同的元素?假设用户提供的数字为“ 4”,那么从我编写的代码中,我希望得到这样的输出:
M y s t
r e e t
r o a
d
但是输出是:
M y s t
M y s t
M y s t
答案 0 :(得分:2)
首先,您应该将givenNumber
转换为int()
,因为input()
总是返回字符串。另外,您可以将整个strAddress
转换为自身,并将其自身的反向版本转换为更易于访问。这里不需要splitAddress
,因为您可以以与本示例中的list相同的方式访问字符串的长度和元素。在您的第一个循环中,您要遍历len(strAddress)/givenNumber
,这是不够的,因为我们需要两次打印地址(使用反向版本),并且需要用?
填充扩展字符,因此我们需要无需使用math
库就可以将其舍入,我们可以像显示的那样进行操作。最后,splitAddress[element]
在这里访问地址的元素索引,该索引在每次迭代中均为数字0 - 6
,因此我们需要考虑row
来打印更多元素。
strAddress = input("What's your street address?")
givenNumber = int(input("What's your favourite number from 1 to 10?"))
strAddress += '|' + strAddress[::-1]
strAddress = strAddress.replace(' ', '|')
lines_to_print = len(strAddress)//givenNumber + (len(strAddress)%givenNumber>0)
for row in range(lines_to_print):
for element in range(givenNumber):
if row*givenNumber + element < len(strAddress):
print(strAddress[row*givenNumber + element], end=' ')
else:
print('? ', end='')
print()
Mystreet road
和6
的输出
M y s t r e
e t | r o a
d | d a o r
| t e e r t
s y M ? ? ?
答案 1 :(得分:0)
您的问题是嵌套循环每次都从0开始返回,并且每次都在同一位置结束。对于您当前的代码,第一个循环只是声明执行第二个循环的次数,第二个循环没有任何输入。要解决此问题,您可以执行for element in range(givenNumber*(row-1),givenNumber*(row))
。
答案 2 :(得分:0)
您从不经过街道地址。 row
取值为0、1、2;但您永远不要使用这些值沿地址字符串移动。看一下打印的内容:
for element in range(0,givenNumber):
print (splitAddress[element], end=' ')
这将打印相同的四个字符,而不管row
的值如何。相反,您需要 truly 将地址分成几行并打印出来。或者,您可以为每一行计算正确的索引:givenNumber*row + element
。
答案 3 :(得分:0)
另一种解决方案是只构建您的字符串(替换字符,将其反转,...),然后为每个定义的行逐字符打印此字符串。为了计算最后一行的填充字符数,可以使用负数的模运算符。
假设您的最终字符串(chars
)长27个字符,给定的单元格编号(givenNumber
)为7。这将导致-27 % 7 = 1
。因此,在这种情况下,需要添加一个填充字符。 chars += charFill * numCharFill
会在末尾添加x次填充字符。
使用索引,您可以逐步遍历字符串并根据需要配置输出。
# strAddress = input("What's your street address?")
# givenNumber = int(input("What's your favourite number from 1 to 10?"))
strAddress = "Mystreet road"
givenNumber = 6
charFill = "?" # char to fill last row
chars = strAddress.replace(" ","|") # replace spaces in strAddress
chars += "|" + chars[::-1] # add reverse chars
numCharFill = -len(chars)%givenNumber # modulo of negative number
chars += charFill * numCharFill # add fill character x times
index = 0
for char in chars:
if index > 0 and not index%givenNumber:
print()
print(chars[index], end=' ')
index = index + 1
答案 4 :(得分:-1)
尝试:
strAddress = input("What's your street address?\n")
givenNumber = int(input("What's your favourite number from 1 to 10?\n"))
charGroupSize = len(strAddress)/givenNumber
charGroups = [strAddress[i:i+givenNumber] for i in range(0, len(strAddress), givenNumber)]
for group in charGroups:
for char in group:
print (char, end=' ')
print()
输出:
What's your street address?
Mystreet road
What's your favourite number from 1 to 10?
4
M y s t
r e e t
r o a
d