2009-05-31 3 views
5

私は、文字列を与えた単純なプログラムを必要とし、次のものを英数字の順序(またはアルファベット順のみ)に返します。Pythonで次の文字列を英数字の順序で取得するにはどうすればよいですか?

f("aaa")="aab" 
f("aaZ")="aba" 

など。

モジュールの1つに既にこの機能がありますか?

+1

ライブラリは一般的に機能が公開されています。仕様が少し恣意的で、そのような機能を持つための一般的な使用事例を考えることができないので、この正確な関数のライブラリサポートがあれば、私は実際に驚いています。 –

+0

一般的に、アルファベットとアルファベットを文字列として扱います。そして、後継者を与える。これは無関係だと思いますか?さて、後継関数とプリミティブ関数によって生成されるすべての種類の代数があります。たとえば、ナチュラルズのように。 –

答えて

12

これを行うための組み込み関数はないと思います。以下の作業をする必要があります:

def next_string(s): 
    strip_zs = s.rstrip('z') 
    if strip_zs: 
     return strip_zs[:-1] + chr(ord(strip_zs[-1]) + 1) + 'a' * (len(s) - len(strip_zs)) 
    else: 
     return 'a' * (len(s) + 1) 

説明:あなたは、zない最後の文字を見つけ、それをインクリメントし、a年代でそれの後のすべての文字を置換します。文字列全体がzの場合は、aの文字列を1つ長く返します。

+0

ありがとう。完璧に動作します。 (実際に正確には、ちょうど誰かがこれを後で使っている場合には、これは小文字の手紙を通るだけですが、私にとってはいいですよね、Cheers、Pietro –

+0

これにはネイティブのpythonメソッドがありません:http://www.ruby -doc.org/core-1.9.3/String.html#method-i-succ – Grocery

3

答えはHow would you translate this from Perl to Python?で十分ですか?あなたが求めているのは100%ではありませんが、近いうちに...

+0

うん、ありがとう、それは十分に見える。乾杯、 ピエトロ –

2

異なる、より長い、おそらくより読みやすく、柔軟なソリューション:各文字がベース26の数字を表す数値に文字列を変換

def toval(s): 
    """Converts an 'azz' string into a number""" 
    v = 0 
    for c in s.lower(): 
     v = v * 26 + ord(c) - ord('a') 
    return v 

def tostr(v, minlen=0): 
    """Converts a number into 'azz' string""" 
    s = '' 
    while v or len(s) < minlen: 
     s = chr(ord('a') + v % 26) + s 
     v /= 26 
    return s 

def next(s, minlen=0): 
    return tostr(toval(s) + 1, minlen) 

s = "" 
for i in range(100): 
    s = next(s, 5) 
    print s 

、ずつ数を増加させ、数を変換します文字列に戻ります。このようにして、文字列として表された値に対して任意の数学演算を行うことができます。

'' minlen ''パラメータは、結果が持つ桁数を制御します(0 == a == aaaaa以降)。

1

は、PythonはRubyが持っているものを持っていないことを吸う:

def next_string(s): 
    a1 = range(65, 91) # capital letters 
    a2 = range(97, 123) # letters 
    a3 = range(48, 58) # numbers 
    char = ord(s[-1]) 
    for a in [a1, a2, a3]: 
    if char in a: 
     if char + 1 in a: 
     return s[:-1] + chr(char + 1) 
     else: 
     ns = next_string(s[:-1]) if s[:-1] else chr(a[0]) 
     return ns + chr(a[0]) 

print next_string('abc') # abd 
print next_string('123') # 124 
print next_string('ABC') # ABD 

# all together now 
print next_string('a0') # a1 
print next_string('1a') # 1b 
print next_string('9A') # 9B 

# with carry-over 
print next_string('9') # 00 
print next_string('z') # aa 
print next_string('Z') # AA 

# cascading carry-over 
print next_string('a9') # b0 
print next_string('0z') # 1a 
print next_string('Z9') # AA0 

print next_string('199') # 200 
print next_string('azz') # baa 
print next_string('Zz9') # AAa0 

print next_string('$a') # $b 
print next_string('$_') # None... fix it yourself 

ない素晴らしい:String#nextは、だからここ英数字の文字列を扱うためのくだらないソリューションです。私のために働きます。

関連する問題