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