Python 3:尝试根据i的函数迭代字母行

时间:2012-10-15 16:18:19

标签: python python-3.x repeat alphabet

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

在此计划中,我们会在i**q % p行打印出来自alpabet的i个字母 例如,如果q=2p=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的第一个字母是:{ {1}}“

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

_________

......但我不知道该怎么办。我打算尝试切片方法,但我不知道。任何意见都将不胜感激。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这似乎应该是家庭作业,所以我会这样回答:

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

答案 2 :(得分:1)

这两个问题是相互联系的:你可以使用itertools中的循环来获得一个迭代器,它将循环遍历字母表(或任何其他字符串,就此而言),并获得给定行的n个字母你可以在迭代器上调用next()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

根据需要进行编辑: - )

答案 3 :(得分: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