【问题标题】:Incrementing a string in python在python中增加一个字符串
【发布时间】:2021-06-24 06:01:28
【问题描述】:

我正在尝试编写一个返回字符串增量的函数。例如,如果输入是“xx”,它应该返回 [xx, xy, xz, ya, yb, ..., zz, aa]。增加单个字符的功能没有问题

def incrementChar(char):
    if char == "z":
        return "a"
    else:
        return chr(ord(char)+1)

我尝试编写一个递归函数,它将输入的最后一个字符递增到“z”,取输入的倒数第二个字符并在让最后一个字符递增的同时将其递增再次从“a”运行到“z”。

我试过这段代码

def incrementString(string):
    possibilities = []
    for i in range(len(string)-1, -1, -1):
        if i == len(string)-1 and string[i] != "z":
              while string[i] != "z": 
                possibilities.append(string.replace(string[i], incrementChar(string[i])))
                string = string.replace(string[i], incrementChar(string[i]))
                print(string)        
        else:
            incrementString(string[i:])
    return possibilities

第一部分有效,它确实将最后一个字符运行到 z,然后将第二个字符增加到最后一个,但开始一次增加所有字符并在无限循环中中断。

我确信我正在监督一些非常明显的事情,(问题必须是倒数第二个字符在字母表中循环时没有被修复)也许有人可以帮助我......

谢谢!

【问题讨论】:

    标签: python loops recursion


    【解决方案1】:

    我喜欢@jdowner 的回答,但对性能感兴趣,所以我尝试了 3 种方法:

    import string
    import timeit
    
    # The original characters and their subsequent character
    orig = string.ascii_lowercase
    tran = orig[1:] + orig[0]
    
    # make a translate table
    trantable = str.maketrans(orig,tran)
    
    # make a translate dictionary
    trandict = dict(zip(orig,tran))
    
    def inc(text):
        if not text:
            return "a"
    
        if text[-1] == "z":
            return inc(text[:-1]) + "a"
    
        return text[:-1] + tran[orig.find(text[-1])]
    
    def inc2(text):
        if not text:
            return "a"
    
        if text[-1] == "z":
            return inc(text[:-1]) + "a"
    
        return text[:-1] + text[-1].translate(trantable)
    
    def inc3(text):
        if not text:
            return "a"
    
        if text[-1] == "z":
            return inc(text[:-1]) + "a"
    
        return text[:-1] + trandict[text[-1]]
    
    for incfunc in [inc,inc2,inc3]:
        print (f"test function {incfunc.__name__}")
        print (timeit.timeit(stmt='incfunc("teststring")', number=1000000, globals=globals()))
    

    返回:

    test function inc
    2.013159
    test function inc2
    1.9140723000000004
    test function inc3
    1.6101508999999998
    

    【讨论】:

      【解决方案2】:

      这就是我的做法。从原始字符到翻译字符的简单映射,并在最后一个字符是“z”或在处理的字符之前没有字符时处理特殊情况。

      import string
      
      # The original characters and their subsequent character
      orig = string.ascii_lowercase
      tran = orig[1:] + orig[0]
      
      
      def inc(text):
          if not text:
              return "a"
      
          if text[-1] == "z":
              return inc(text[:-1]) + "a"
      
          return text[:-1] + tran[orig.find(text[-1])]
      

      【讨论】:

      • 也许创建翻译词典可能比 find 方法快一些。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-23
      • 2015-06-18
      相关资源
      最近更新 更多