【问题标题】:Combine two strings (char by char) and repeat last char of shortest one组合两个字符串(逐个字符)并重复最短的最后一个字符
【发布时间】:2016-11-05 02:04:09
【问题描述】:

我有两个字符串,(string1 和 string2)。

如果它们的长度相等,则该函数应返回一个字符串,该字符串由两个字符串中的每一个中的字符交替形成。

如果它们的长度不相等,则该函数通过重复最后一个字符来扩展较短的字符串,直到它们的长度相同,然后交替两个字符串的字符。

例如,

extendedString("abc", "def") =>  "adbecf" 
extendedString("ab", "defg") =>  "adbebfbg"

如果字符串长度相同,我已经写了它返回的部分,但我不知道如何重复最后一个字符。

def extendedString(string1, string2):
    x = string1
    y = string2
    z = ""
    if len(x) == len(y):
        return "".join(i for j in zip(string1,string2) for i in j)

【问题讨论】:

    标签: python string


    【解决方案1】:

    您可以使用 itertools 中的 zip_longest function
    像 zip 一样工作,但让您能够填充空白(默认填充符是 None,但您可以更改它:

    import itertools
    
    def extendedString(string1,string2):
        filler = string2[-1] if len(string1)>len(string2) else string1[-1]
        return "".join(i for j in itertools.zip_longest(string1, string2, fillvalue=filler) for i in j)
    

    更新

    将填充符添加为最短字符串的最后一个字符(以防万一)

    In [50]: extendedString("abc","def")
    Out[50]: 'adbecf'
    
    In [51]: extendedString("ab","defg")
    Out[51]: 'adbebfbg'
    

    如果你使用的是python2,函数是itertools.izip_longest

    【讨论】:

    • 哦,很好。不知道那个。
    • itertools 是一个很棒的库 :) 可以为您节省大量时间(和代码!)
    • 将感谢投反对票者关于投反对票的说明。谢谢!
    【解决方案2】:

    不需要itertoolsone-liner 解决方案:

    def extendedString(a,b):
        return ''.join(x+y for x,y in zip(*(s+s[-1]*(max(len(a),len(b))-len(s)) for s in (a,b))))
    

    输出:

    $ extendedString('abc','1234')
    'a1b2c3c4'
    $ extendedString('abc','12')
    'a1b2c2'
    

    【讨论】:

      【解决方案3】:

      首先使两个字符串长度相同,然后加入。比如:

      def extendedString(string1,string2):
          x=string1
          y=string2
      
          if len(x) < len(y):
              x = x + x[-1] * (len(y) - len(x))
          elif len(x) > len(y):
              y = y + y[-1] * (len(x) - len(y))
      
          return "".join(i for j in zip(x, y) for i in j)
      
      print extendedString("abc", "def")
      print extendedString("ab","defg") 
      print extendedString("defg","ab") 
      

      输出:

      $ python test.py
      adbecf
      adbebfbg
      daebfbgb
      $
      

      【讨论】:

        【解决方案4】:

        只需将最后一个字符添加到较短的字符串中,直到它们的长度相同。在 python 中,定义了 string*int。例如"a"*3"aaa"。所以 x = x+x[-1]*(len(y)-len(x)) 做你需要做的事情。然后,您只需要使用具有相同长度的新字符串值递归调用该函数。

        def extendedString(string1,string2):
            x=string1
            y=string2
            z=""
            if len(x)==len(y):
                return "".join(i for j in zip(string1,string2) for i in j)
            elif len(x) < len(y):
                x = x+x[-1]*(len(y)-len(x))
                return extendedString(x,y)
            else:
                y = y+y[-1]*(len(x)-len(y))
                return extendedString(x,y)
        

        【讨论】:

          【解决方案5】:

          您可以通过查找较短和较长的字符串并将较短字符串的-1th字符的N附加到自身来完成长度不相等的情况,其中N是差异长度介于较短和较长之间。从那里,您返回相同的 zip/join 表达式。

          def extendedString(string1, string2):
              if len(string1) == len(string2):
                  return "".join(i for j in zip(string1, string2) for i in j)
              else:
                  longer, shorter = (string1, string2) if len(string1) > len(string2) else (string2, string1)
                  shorter = shorter + shorter[-1] * (len(longer) - len(shorter))
                  return "".join(i for j in zip(shorter, longer) for i in j)
          

          【讨论】:

            【解决方案6】:
            a = "hell"
            b = "heaven"
            print "".join(i for j in itertools.izip_longest(a, b, fillvalue=a[-1] if len(a)<len(b) else b[-1]) for i in j)
            
            Output: hheelalvleln
            

            【讨论】:

              【解决方案7】:

              好的,我意识到这已经被遗忘了,但我已经开始研究我的了,所以就这样吧。

              注意:此实现将始终首先打印较短的字符串,如果您想始终从打印string1 的第一个字符开始,请参阅下面的更新。

              我喜欢你复制输入参数,因为这是保留输入的好习惯,我只是稍微修改了它以添加一个约定,所以len(x) &lt;= len(y) 总是正确的。我还选择不使用其他库,而是自己实现zip

              def extendedString(string1, string2):
                  if len(string1) <= len(string2):  # Convention: len(x) <= len(y)
                      x = string1
                      y = string2
                  else:
                      x = string2
                      y = string1
                  z=""
                  for i in range(len(x)):           # Go through shorter string
                      z+=x[i]                       # Add the i-th char in x to z
                      z+=y[i]                       # Add the i-th char in y to z
                  if i < len(y):                    # If the second string is longer
                      for j in range(i+1, len(y)):  # for the rest of the length
                          z+=x[i]                   # add the last char of x to z
                          z+=y[j]                   # add the j-th char of y to z
                  return z
              
              print(extendedString("abc", "efg"))
              print(extendedString("ab", "defg"))
              print(extendedString("abcd", "ef"))
              

              输出:

              $ python zip.py
              aebfcg
              adbebfbg
              eafbfcfd
              

              更新

              此实现将确保始终首先打印string1

              def extendedString(string1, string2):
                  x = string1
                  y = string2
                  z=""
                  if len(x) <= len(y):
                      shorter = x
                      longer = y
                  else:
                      shorter = y
                      longer = x
                  for i in range(len(shorter)):
                      z+=x[i]
                      z+=y[i]
                  if i < len(longer):
                      for j in range(i+1, len(longer)):
                          if shorter == x:
                              z+=x[i]
                              z+=y[j]
                          else:
                              z+=x[j]
                              z+=y[i]
                  return z
              
              print(extendedString("abc", "efg"))
              print(extendedString("ab", "defg"))
              print(extendedString("abcd", "ef"))
              

              输出:

              $ python zip.py
              aebfcg
              adbebfbg
              aebfcfdf
              

              【讨论】:

                猜你喜欢
                • 2015-08-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-08-01
                • 2014-07-11
                • 1970-01-01
                • 2011-12-20
                • 1970-01-01
                相关资源
                最近更新 更多