2012-10-15 50 views
0

我试图创建一个高度为291行的文本金字塔。我的意思是:Python 3:创建一个字母金字塔

Here is an example of a pyramid of height 6: 
-----a-----  
----bcd---- 
---efghi--- 
--jklmnop-- 
-qrstuvwxy- 
zabcdefghij 

Notice: 
-- each line has the same number of characters 
-- the letters a-z form the pyramid, and are re-used. 

到目前为止,所有我已经是这样的:

letters="abcdefghijklmnopqrstuvwxyz" 
#(291*2)-1 
for i in range (581):  

我真的想学习如何做到这一点,所以任何帮助或在正确的方向推将不胜感激,而不是答案本身:)

+3

如果你真的想学习,然后第一次尝试自己的东西。 –

+1

有很多关于SO的提示,例如,请看[Python中的星号pyramid Pyramid](http://stackoverflow.com/q/4911341)。 –

+0

谢谢,我实际上在发布之前阅读过。我真正的问题是如何在那里获得破折号。如果我所要做的只是带有正确字母的线条,我可以轻松地做到这一点,但我也需要用金字塔正确对齐金字塔。 – JackD

回答

7
from itertools import cycle, islice 

letters = "abcdefghijklmnopqrstuvwxyz" 
height = 6 
width = height*2-1 

it = cycle(letters) 
for count in range(1, width+1, 2): 
    print(''.join(islice(it, count)).center(width, '-')) 

该解决方案使用itertools模块。
cycle函数使得迭代器无限期地重复我们的字母序列,并且islice用于每次从它接收下一个count字母(因为它们被逐个字符地分开,我们使用''.join(...)将它们分成一个字符串) 。所以我们有下一行,但没有破折号。其余的很简单:只需center吧。


另一个非常类似的解决方案,只是不itertools

letters = "abcdefghijklmnopqrstuvwxyz" 
height = 6 
width = height*2-1 

buf = "" 
def next_letters(n): 
    global buf, letters 
    while len(buf)<n: 
     buf += letters 
    ret, buf = buf[:n], buf[n:] 
    return ret 

for count in range(1, width+1, 2): 
    print(next_letters(count).center(width, '-')) 

buf(缓冲液)的变量将保持从序列中的下一字母。 next_letters函数将检查其中是否有足够的字母并根据需要进行扩展,然后返回其第一个字母并“删除”它们。

让我们来看看它是如何工作的一个 “调试版本”:

letters = "abcdefghijklmnopqrstuvwxyz" 
height = 6 
width = height*2-1 

buf = "" 
def next_letters(n): 
    global buf, letters 
    print("Requested {} letters. Buffer is '{}'".format(n, buf)) 
    while len(buf)<n: 
     buf += letters 
     print("Buffer was extended to '{}'".format(buf)) 
    ret, buf = buf[:n], buf[n:] 
    print("Returned '{}'; buffer is now '{}'".format(ret, buf)) 
    return ret 

for count in range(1, width+1, 2): 
    print(next_letters(count).center(width, '-')) 

要求1个字母。缓冲区为''
缓冲区扩展为'abcdefghijklmnopqrstuvwxyz'
返回'a';缓冲区现在是'bcdefghijklmnopqrstuvwxyz'
----- a -----
已请求3个字母。缓冲区是'bcdefghijklmnopqrstuvwxyz'
返回'bcd';缓冲区现在'efghijklmnopqrstuvwxyz'
---- bcd ----
已请求5个字母。缓冲区是'efghijklmnopqrstuvwxyz'
返回'efghi';缓冲器现在'jklmnopqrstuvwxyz'
--- efghi ---
已请求7个字母。缓冲区是'jklmnopqrstuvwxyz'
返回'jklmnop';缓冲区现在是'qrstuvwxyz'
--jklmnop--
已请求9个字母。缓冲区是'qrstuvwxyz'
返回'qrstuvwxy';缓冲区现在是'z'
-qrstuvwxy-
已请求11封打印字符。缓冲区为'z'
缓冲区扩展为'zabcdefghijklmnopqrstuvwxyz'
返回'zabcdefghij';缓冲区现在是“klmnopqrstuvwxyz”
zabcdefghij

+0

替换那些空格哇,我真的很感激它!你能解释一件事吗?最后两行对我来说没有任何意义。它的工作原理,我只是喜欢了解它。我认为这是计数和加入和islice部分... – JackD