我目前编写的代码以递归方式取两个字符串中的字母并以交替的字母返回新单词。我想优化这段代码,这样如果第一个或第二个单词更长,它仍会返回较长字符串中的剩余字母。
def alt(s,t):
if len(s) != len(t):
return
elif s == '' and t == '':
return ''
else:
return s[0] + t[0] + alt(s[1:], t[1:])
期望的输出:
>>> alt('hello','bye')
'hbeylelo'
答案 0 :(得分:3)
只是测试s
和t
是空的,如果其中一个是,则返回其他值:
def alt(s, t):
if not s:
return t
elif not t:
return s
else:
return s[0] + t[0] + alt(s[1:], t[1:])
即使s
和t
都为空,也会返回空字符串,这是一个完全有效的结束状态。
您可以将此缩短为:
def alt(s, t):
if not (s and t):
return s + t
return s[0] + t[0] + alt(s[1:], t[1:])
所以只要s
或t
为空(或两者都是),就会达到最终状态。
这会产生您想要的输出:
>>> alt('hello', 'bye')
'hbeylelo'
迭代版本将是:
from itertools import chain
try:
# Python 2
from itertools import izip_longest as zip_longest
except ImportError:
# Python 3
from itertools import zip_longest
def alt_iterative(s, t):
return ''.join(chain.from_iterable(zip_longest(s, t, fillvalue='')))
这使用itertools.zip_longest()
function来完成大部分工作。
答案 1 :(得分:0)
问题本身并不是递归的。在这种情况下,迭代解决方案可能更简单。
Python 2:
from itertools import izip_longest
def alt(s, t):
return ''.join(a + b for a, b in izip_longest(s, t, fillvalue=''))
Python 3:
from itertools import zip_longest
def alt(s, t):
return ''.join(a + b for a, b in zip_longest(s, t, fillvalue=''))
答案 2 :(得分:0)
如果您喜欢使用itertools.chain
和zip
(或itertools.zip_longest / izip_longest)的单行代码:
# Python 2
return ''.join(chain(*zip(s, t))) + s[len(t):] + t[len(s):]
# or
return ''.join(chain(*izip_longest(s, t, fillvalue='')))
# Python 3
return ''.join(chain(*zip_longest(s, t, fillvalue='')))