1

我正在尝试编写一个执行以下操作的程序:

在这个程序中,我们在线打印出i**q % p字母表中的字母i ,例如,如果q=2我们p=12想要打印:

1**2 % 12 = 1
2**2 % 12 = 4
3**2 % 12 = 9
4**2 % 12 = 4
5**2 % 12 = 1

...所以输出的前五行将是:

a                                                                             
bcde                                                                       
fghijklmn                                                                  
opqr                                                                       
s   

就我而言,确定字符数的函数是(i**2)%9,但它是相同的想法。具体任务如下:

“按顺序使用字母 az 打印1834行,这样行号 i 将使用(i**2 ) % 9字母。用于打印行的第一个字母1834是:_________

我已经开始编码,我有两个主要问题。首先,一旦我到达“z”(或更可能是“第 25 位”),如何让字母重新开始?
另外,我应该为程序做什么?到目前为止,我有:

letters="abcdefghijklmnopqrstuvwxyz"
for i in range[1,1834]:
    x=((i**2)%9)
    print(letters[])

...但我不知道如何进行。我打算尝试切片方法,但我不知道。任何输入将不胜感激。

4

4 回答 4

3

这是您可以使用的东西itertools

from string import ascii_lowercase
from itertools import cycle, islice

letters = cycle(ascii_lowercase)
for num in (1, 4, 9, 4, 1, 13, 12, 9, 5):
    print (''.join(islice(letters, num)))

#a
#bcde
#fghijklmn
#opqr
#s
#tuvwxyzabcdef
#ghijklmnopqr
#stuvwxyza
#bcdef
于 2012-10-15T16:58:36.877 回答
1

看来这应该是作业,所以我会这样回答:

  • 要从索引切片a到索引b,您可以使用my_list[a:b]
  • 要在达到 26 时从 0 重新开始计数,您需要迭代器的余数i除以字母数 26。a%ba除以的余数b
  • range(n)0是一个从to返回数字的函数n-1,因此您总共会得到 n 个元素。它是一个函数,所以你应该使用括号,即range(1834)range[1834](即切片)。
  • 另请注意,总共range(1,1834)会有1834-1=1833元素,这不是你需要的......
  • 有一个名为的包string,其中包含字母字符列表(小写、大写、数字……)。参见例如string.lowercase
于 2012-10-15T16:34:34.713 回答
1

这两个问题是相互关联的:您可以使用itertools中的循环来获取一个迭代器,该迭代器将无限循环遍历字母表(或任何其他字符串,就此而言),并获取给定行的 n 个字母,您可以调用 next() on迭代器 n 次。

你的问题看起来像家庭作业,所以我不会让你的教育短路,而是举一个在第 n 行打印 n 个字母的类似问题的例子:

import itertools
str = "abcdefghijklmnopqrstuvwxyzicopiedthisfromstackoverflow"
it = itertools.cycle( str )
for i in range( 1 , 10 ):
    line=""
    for j in range( i ):
        line+=it.next()
    print i,line

酌情编辑:-)

于 2012-10-15T16:45:50.190 回答
0

尝试以下解决方案。您正在字母上移动一个框架,因此每次新的循环迭代开始时,变量start_position应该记住上一次迭代在哪个字母处停止。框架的大小由您的x计算确定。

如果你想回到字母表的开头,它应该以字母表的长度为模。end_position = end_position % 26

letters="abcdefghijklmnopqrstuvwxyz"
alphabet_length = len(letters)
start_position = 0
for i in range(1,1834):
    x=((i**2)%9)
    end_position = start_position + x
    end_position = end_position % alphabet_length
    if end_position < start_position:
         print letters[start_position:alphabet_length-1] + letters[0:end_position]
    else:
         print letters[start_position:end_position] 
    start_position = end_position
于 2012-10-15T16:26:22.577 回答