-
我有一个字符串'abcdef'
-
需要打印元素,如第一个元素,最后一个元素,第二个元素,倒数第二个元素
-
预期输出为
afbecd
-
abcde
的另一个输出预期是aebdc
-
我们可以在不创建额外列表的情况下完成吗
伪代码:
str1 = 'abcdef'
i= 0
j = 1
new_str = ''
while (i < len(str1) && j > len(str1) and i!=j):
new_str = str1[i] + str1[j]
没有任何虚假的内存使用,您可以对reversed
和zip
使用一些惰性迭代器/生成器
def interleave(s):
gen = (c for pair in zip(s, reversed(s)) for c in pair)
return "".join(next(gen) for _ in s)
>>> interleave("abcdef")
'afbecd'
>>> interleave("abcde")
'aebdc'
您可以引入更多utils来进一步缩短代码:
from itertools import chain
def interleave(s):
gen = chain.from_iterable(zip(s, reversed(s)))
return "".join(next(gen) for _ in s)
使用您的方法,您可以:
str1 = 'abcdef'
i= 0
j = len(str1) - 1
new_str = ''
while (j>i):
new_str += str1[i] + str1[j]
i+=1
j-=1
if len(str1) % 2 != 0:
new_str += str1[j]
print(new_str)
输出:
afbecd
在我看来,这里有两种基于字符串长度的可能性,但它们实际上只是在如何处理中间字符方面有所不同。因此,输入abcdefg
的输出应该是agbfced
,而abcdef
的输出应该是afbecd
。
考虑到以上,我认为这应该是可行的:
def zip_str(input_str):
width = len(input_str)
half_width = int(width / 2)
new_str = ""
for i in range(0, half_width):
new_str += input_str[i] + input_str[-1 - i]
return new_str if width % 2 == 0 else new_str + input_str[half_width]
一种不是特别有效但简单且有趣的方法是继续反转剩余的字符串(在线尝试!):
s = 'abcdef'
result = ''
while s:
*s, char = reversed(s)
result += char
print(result)
或者,因为你实际上说你想打印(在线试试!):
s = 'abcdef'
while s:
*s, char = reversed(s)
print(char, end='')