我正在尝试编写一个执行以下操作的程序:
在此计划中,我们会在i**q % p
行打印出来自alpabet的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
的第一个字母是:{ {1}}“
我已开始编码,我有两个主要问题。
首先,一旦我达到“z”(或更可能是“第25位”),如何让字母表重新开始?
另外,该怎么办?到目前为止,我有:
_________
......但我不知道该怎么办。我打算尝试切片方法,但我不知道。任何意见都将不胜感激。
答案 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]
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