【问题标题】:Is there a more efficent way to extend a string? [duplicate]有没有更有效的方法来扩展字符串? [复制]
【发布时间】:2019-08-17 10:42:38
【问题描述】:

有没有人知道一种更有效的方法来扩展字符串,例如fred,使其成为字符串plaintext 的长度——这样fred 就会变成fredfredf——比这更有效吗?

# key='fred', msg='plaintext'?

def keypad(key, msg):
    while len(key) < len(msg):
        key += key
    key = key[:len(msg)]
    return key

【问题讨论】:

    标签: python string loops


    【解决方案1】:

    使用islice + cycle 来自itertools

    from itertools import islice, cycle
    
    key = 'fred'
    msg = 'plaintext'
    
    print(''.join(islice(cycle(key), len(msg))))
    # fredfredf
    

    【讨论】:

      【解决方案2】:

      不需要导入,创建尽可能少的东西。可能比Austins solution 更好(没有导入,更长的源代码):

      key='fred'
      msg='plaintext'
      
      def keypad(key, msg):
          lk = len(key)
          lm = len(msg) 
          return ''.join( [ key[idx%lk] for idx in range(lm) ] )
      
      print(keypad(key,msg))
      # fredfredf
      

      利用key-text 上的模除法与列表相结合(.join() 无论如何都会在内部将生成器转换为列表 - 首先使用列表更快 - 感谢@Austin 的评论) .

      优势:

      • 没有导入
      • 没有字符串切片
      • 使用生成器,因此不会创建中间字符串(最后只有一个)
      • 没有过冲被切掉

      建议阅读:

      List vs generator comprehension speed with join function 用于列表与生成器的join() 的速度

      【讨论】:

      • +1。好一个,但我会将该生成器替换为列表组合。 join 使用列表 comp 比使用生成器更快。
      • @Austin 你一直告诉我,我忘记了。 UPS。已添加。
      • 大声笑。很高兴,你还记得我的话。 :)
      • @Austin 甚至找到了它的参考资料 ;)
      • 似乎这是目前欺骗目标尚未涵盖的唯一解决方案。
      【解决方案3】:
      key='fred'
      msg='plaintext'
      key = key*(len(msg)//len(key) + 1) 
      print(key[:len(msg)]) 
      #fredfredf
      

      或者

      print((key*(len(msg)//len(key) + 1))[:len(msg)])
      

      【讨论】:

        【解决方案4】:
        • 您可以使用 divmod 到 计算所需的完整重复次数,以及 多余的字符。
           def keypad(key, msg):
             wanted = len(msg)
             a, b = divmod(wanted, len(key))
             return key * a + key[:b]
        

        重复一个字符串,直到它至少达到你想要的长度。

        • 您计算适当的重复次数并将其放在 该乘法运算符的右侧。

        • 然后,您可以使用数组将其修剪到所需的确切长度 切片:

           def keypad(key, msg):
             length = len(msg)
             return (key * (int(length/len(key))+1))[:length]
        

        【讨论】:

          【解决方案5】:

          不如奥斯汀的解决方案好,但比你的好:

          你的方法效率低下,因为你

          • 连接字符串:旧的被销毁,新的被创建(一遍又一遍)
          • 您在每次迭代中将组合字符串的长度加倍(可能会出现巨大的超调)

          最好计算频率 key 适合 msg 并仅创建一个结果字符串(减少创建/销毁的字符串的数量)并减少结果字符串的大小。

          key='fred'
          msg='plaintext'
          
          def keypad(key, msg):
              l=len(msg)               # store loally  so you do not call len twice on it
              mult = l//len(key) + 1
              return (key*mult)[:l]    # overshoots maximally by len(k)-1 characters
          
          print(keypad(key,msg))
          

          为以下对象创建的字符串:

          key = "1234"
          msg = "1234567890123456789"
          

          我们创造

          "12341234"                         # you, created, thrown away
          "1234123412341234"                 # you, created, thrown away
          "12341234123412341234123412341234" # you
          
          "12341234123412341234"             # me
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-11-12
            • 1970-01-01
            • 1970-01-01
            • 2020-04-16
            • 2010-10-16
            • 2011-01-01
            • 1970-01-01
            相关资源
            最近更新 更多