2012-10-15 18 views
1

我想编写一个程序,执行以下操作:的Python 3:尝试基于功能遍历字母表中的行i

在这个程序中,我们从上线i 的alpabet打印出来i**q % p信例如,如果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,但它是一样的想法。 具体任务如下:

“的顺序打印出来使用字母1834线AZ,使得行号我会用(i**2) % 9字母用来打印线1834第一个字母是:_________

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

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

...但我不知道如何继续。我会尝试一种切片方法,但我不知道。任何输入将不胜感激。

+0

FYI:'POW(X,Y,Z)'等同于'(X ** Y)%z',但速度更快(特别是如果' x ** y'非常大)。 – nneonneo

回答

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 
+0

这很有道理!然而,我现在越来越“类型错误:”类型的“对象不可以订阅” – JackD

+0

@ user1745840这是因为'范围[1,1834]'... – jadkik94

1

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

  • 从指数a切片指数b,您可以使用my_list[a:b]
  • 要重新启动计数从0时到26时,需要通过信件26 a%b数除以迭代器i其余a d的剩余部分通过b进行了排除。
  • range(n)是返回人数从0n-1的功能,所以在总,你会得到n个元素。这是一个函数,所以你应该使用圆括号,即range(1834)而不是range[1834](即切片)。
  • 还要注意的是range(1,1834)将在总1834-1=1833元素,这是不是你所需要的...
  • 有一个叫string包,其中有字母字符(小写字母,大写字母,数字,...)名单。参见例如string.lowercase
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

这里的东西,你可以使用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 
+0

我不认为这是OP应该如何做它 - 功课太神奇了 - 但+1优雅! – DSM