Python创建街道地址表

时间:2019-01-22 20:41:00

标签: python python-3.x

对于编程非常陌生,对于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

5 个答案:

答案 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 road6的输出

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