1

次のことを行うプログラムを作成しようとしています。

このプログラムでは、たとえば印刷したい 場合に、alpabet の文字をオンラインで印刷i**q % pします。iq=2p=12

1**2 % 12 = 1
2**2 % 12 = 4
3**2 % 12 = 9
4**2 % 12 = 4
5**2 % 12 = 1

...したがって、出力の最初の 5 行は次のようになります。

a                                                                             
bcde                                                                       
fghijklmn                                                                  
opqr                                                                       
s   

私の場合、文字数を求める関数は ですが(i**2)%9、考え方は同じです。具体的なタスクは次のとおりです。

"1834行番号 i が文字を使用するように、文字 a ~ z を順番に使用して行を印刷し(i**2 ) % 9ます。行の印刷に使用される最初の文字1834は次のとおりです。_________"

コーディングを始めましたが、主な質問が 2 つあります。まず、「z」(または「25位」)に到達したら、アルファベットを最初からやり直すにはどうすればよいですか?
また、プログラムのために何をすればよいですか? これまでのところ、私は持っています:

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

…が、進め方がわからない。スライス法をしようと思ったのですが、わかりません。任意の入力をいただければ幸いです。

4

4 に答える 4

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
于 2012-10-15T16:58:36.877 に答える
1

これは宿題のようですので、次のように答えます。

  • aindex からindex にスライスするbには、次を使用できますmy_list[a:b]
  • 26 に到達したときに 0 からカウントを再開するには、反復子の余りを26 の文字数で割った余りが必要です。 は で割った余りです。ia%bab
  • range(n)0からまでの数値を返す関数なn-1ので、合計で n 個の要素が得られます。これは関数であるため、括弧を使用する必要があります。つまり、使用しrange(1834)ませんrange[1834](つまり、スライスします)。
  • range(1,1834)また、合計で要素が含まれることに注意してください1834-1=1833。これは必要なものではありません...
  • stringアルファベット文字 (小文字、大文字、数字など) のリストを含むというパッケージがあります。たとえば、string.lowercaseを参照してください。
于 2012-10-15T16:34:34.713 に答える
1

2 つの質問はリンクしています: 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

適宜編集してください:-)

于 2012-10-15T16:45:50.190 に答える
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
于 2012-10-15T16:26:22.577 に答える