【问题标题】:Python 3: Trying to iterate lines of alphabet based on function of iPython 3:尝试根据 i 的函数迭代字母行
【发布时间】:2012-10-15 16:18:19
【问题描述】:

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

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

“使用字母 a-z 依次打印出 1834 行,这样行号 i 将使用 (i**2 ) % 9 字母。用于打印行 1834 的第一个字母是:_________

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

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

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

【问题讨论】:

  • 仅供参考:pow(x, y, z) 等同于 (x**y)%z,但速度更快(尤其是在 x**y 非常大的情况下)。

标签: python python-3.x repeat alphabet


【解决方案1】:

您可以使用 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

【讨论】:

  • 我不认为 OP 应该这样做——对于家庭作业来说太神奇了——但是为了优雅而 +1!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这两个问题是相互关联的:您可以使用来自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
    

    酌情编辑:-)

    【讨论】:

      【解决方案4】:

      尝试以下解决方案。您正在字母上移动一个框架,因此每次新的循环迭代开始时,变量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
      

      【讨论】:

      • 有道理!但是,我现在收到“类型错误:'type' object is not subscriptable”
      猜你喜欢
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 2022-10-25
      • 1970-01-01
      • 2018-04-30
      • 2013-05-18
      相关资源
      最近更新 更多