组合两个字符串(char by char)并重复最短的一个char

时间:2016-11-05 02:04:10

标签: python string

我有两个字符串,(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)

7 个答案:

答案 0 :(得分:11)

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

array([[0, 1, 2, 1, 0],
       [1, 2, 3, 2, 1],
       [2, 3, 4, 3, 2],
       [1, 2, 3, 2, 1],
       [0, 1, 2, 1, 0]])

更新

添加填充物作为最短字符串的最后一个字符串(如果需要的话)

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)

如果您使用的是 python2 ,则该功能为In [50]: extendedString("abc","def") Out[50]: 'adbecf' In [51]: extendedString("ab","defg") Out[51]: 'adbebfbg'

答案 1 :(得分:7)

one-liner解决方案,不需要itertools

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'

答案 2 :(得分:2)

只需将最后一个字符添加到较短的字符串,直到它们的长度相同。在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)

答案 3 :(得分:2)

首先制作相同长度的两个字符串,然后加入。类似的东西:

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 :(得分:1)

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

N

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

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

我喜欢你复制输入参数,因为这是保存输入的好习惯,我只是稍微修改它以添加约定,因此len(x) <= 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