2011-11-28 11 views
1

ループの各繰り返しで、変数(lett)をアルファベットの次の文字に変更しようとしています。この変数をスクリプトの冒頭で特定の文字に設定することもできなければなりません(そして、スクリプトの使用に応じて最初の文字が変わります)。 (私はまだ学んでいたとき)Pythonのループで変数の文字進行を作成する方法は?

初期スクリプト::私は、次のコードビットの作成を開始し

while lett_trig == 2: 
    if set_lett == 2: 
     lett = "a" 
    if set_lett == 3: 
     lett = "b" 
    if set_lett == 4: 
     lett = "c" 
    if set_lett == 5: 
     lett = "d" 
    if set_lett == 6: 
     lett = "e" 
    if set_lett == 7: 
     lett = "f" 
    if set_lett == 8: 
     lett = "g" 
    if set_lett == 9: 
     lett = "h" 
#... and this goes on till it reaches if set_let == 27: lett = "z" 

    set_lett += 1 
    if set_lett == 28: 
     set_lett = 2 
    print lett 

# set_lett starts at two because I left set_lett == 1 to create a space (" ") 

これは、もちろん、より大きなスクリプトを簡略化したものです。 これは私が思い付くことができる唯一の簡素化:

lett_trig = 2 
x = 0 

a = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] 

while lett_trig == 2: 
    lett = a[x] 
    x += 1 
    if x == 26: 
     x = 0 

数学的に別の手紙から変更するための他の方法はありますか?いくつかのバイナリ変換操作を通して?またはリスト方法で最も効率的ですか?


回答:すべての答えを通過すると効率のためにそれらをテストした後、私は最速(かつクリーン)する辞書機能を発見しました。コードの例:

import string 

letter_map = dict(zip(string.ascii_lowercase, string.ascii_lowercase[1:] + string.ascii_lowercase[0])) 
lett1 = "d" 

while ord(lett2) < 122: 
    print lett1 
    lett1 = letter_map[lett1] 

答えて

8

使用itertools.cycle:これにより

import itertools 
import string 
letters = itertools.cycle(string.lowercase) 

letters繰り返しからZまで実行し、文字の無限列です。これはwhileループで使用することができます。letters.next()またはforループには、終了条件を何らかの形で、たとえばitertools.isliceに設定します。

あなたは関数に一緒にこれを置くことができます。

def cyclic_letters(start='a'): 
    i = string.lowercase.index(start) 
    letts = string.lowercase[i:] + string.lowercase[:i] 
    return itertools.cycle(letts) 

cyclic_letters機能も'a'をデフォルト、シーケンスの最初の文字を選択することができます。

また、任意の文字の次の文字を表示する辞書を使用することもできます。これは、そう、例えば、letter_map['c']'d'が生成されます、使用して、単なる辞書で

letter_map = dict(zip(string.lowercase, string.lowercase[1:] + string.lowercase[0])) 

:あなたは、このようなことなどによって、そのための辞書を作成することができます。

上記では、string.lowercaseは、小文字を含む単なる文字列です。値はロケールによって異なります。 'abcdefghijklmnopqrstuvwxyz'が必要な場合は、ロケールに関係なく、string.ascii_lowercaseを代用するか、明示的な文字列を指定するだけです。

+0

'string.lowercase'は**文字列**' 'abcdefghijklmnopqrstuvwxyz \ x83 \ x90 \ x9a \ x9c \ x9d \ x9e \ x9f \ x9e \ x9f \ xa ... ''です(これに精通していない人それは関数や他のオブジェクトのように見えるかもしれません)、コードスニペットを理解することをより困難にします。 – ovgolovin

+0

は、サイクルの特定の文字を呼び出す方法はありますか?たとえば、lett_1を "h"から "i"に設定した場合、lett_2を "c"から "d"に設定しますか? – Gronk

+0

@ovgolovin 'string.lowercase'は、ここでは' 'abcdefghijklmnopqrstuvwxyz ''です。これはPython 2.7です。おそらくあなたのコメントの余分な文字はPython 3(これは私が今使っているコンピュータにはインストールされていない)で、Unicodeです。 –

4

xは、範囲内の整数0文字のASCIIコードを返し、 chr()

ord()

25にある
chr(x + ord("a")) 

のようなものを試してみてくださいASCIIコードを再び文字に変換します。 ASCIIでは、小文字はすべて連続して表示されます(EBCDICとは対照的に、覚えている人はEBCDICと対照的です)。

+0

これは非常にきれいで、柔軟性があるようですが、私のリストメソッドに対してテストすると、実際にはより多くの処理を実行する必要があります。非常に大きなループを実行すると、数秒かかりました。 – Gronk

+0

@ user1042034:あなたはパフォーマンスの後であるとは言いませんでした。その場合、もちろん 'ord(" a ")'をハードコードされた '97'で置き換えるべきです。おそらく、あなたが達成しようとしているものに全く異なるアルゴリズムを使うべきでしょう。 –

+0

lett = chr(x)\ n x + = 1は、500000回のループで実行すると、リストメソッドよりもまだ遅くなります。私はまだそれがいかにクリーンであるかはまだ好きです。 – Gronk

0

文字のASCIIコードは連続しています。したがって65 = 'A'、66 = 'B'など - ASCII table通常のループを使用できます。

97(小文字の 'a')で始まり、通常のインクリメントを使用してループし、ループカウンタを出力と同じ文字に変換します。

1
idx = 0 
while condition: 
    lett = chr(idx + ord('a')) 
    idx += 1 
    if idx == 26: 
     idx = 0 

ordchr

1

はあなたがやっていることによって、あなたはstring.lowercaseに興味があるかもしれないし、それはいとこだ参照してください。

>>> import string 
>>> for let in string.lowercase: 
... print let 
... 
a 
b 
c 
(etc) 

詳細はthe documentationを参照してください。

関連する問題