簡體   English   中英

如何在Python中以字母數字順序獲取下一個字符串?

[英]How can I get the next string, in alphanumeric ordering, in Python?

我需要一個給出字符串的簡單程序,在字母數字排序中返回下一個(或者只是字母順序)。

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

等等。

在其中一個模塊中是否有這個功能?

我不認為有這樣做的內置功能。 以下應該有效:

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的是一個更長的時間。

答案在你如何將這個從Perl翻譯成Python? 足夠? 不是100%你要問的,但關閉......

一個不同的,更長的,但也許更具可讀性和靈活性的解決方

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

您將字符串轉換為數字,其中每個字母代表基數26中的數字,將數字增加1並將數字轉換回字符串。 這樣,您可以對表示為字母串的值進行任意數學運算。

''minlen''參數控制結果的位數(因為0 == a == aaaaa)。

很糟糕,python沒有ruby所擁有的東西: String#next所以這里是處理字母數字字符串的糟糕解決方案:

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

不是很好。 有點適合我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM