Спецификация проблемы говорит о том, что s1
и s2
имеют одинаковую длину, поэтому ваш код должен использовать это предположение. Конечно, неплохо иметь надежный код и может правильно справиться с широким диапазоном входных данных, но это также важная часть кодирования для написания кода, который соответствует спецификациям, в противном случае вы получите раздутый код, который повторяет выполненную работу другими частями программы.
Ваше решение очень близко к тому, что вам нужно, вам просто нужно добавить s1[i] + s2[i]
в начало s3
.
s1 = 'hello'
s2 = 'world'
s3 = ''
for i in range(len(s1)):
s3 = s1[i] + s2[i] + s3
print(s3)
выход
odlllreohw
Обратите внимание, что я использовал range(len(s1))
вместо range(0, len(s1))
. Когда диапазон начинается с нуля (и увеличивается с шагом 1), мы можем опустить аргумент start
.
Если вы сделали нужно обрабатывать входные строки разной длины вы могли бы справиться с этим с помощью нарезки для получения отдельных символов. Это работает, потому что если вы вырезаете за пределы строки, вы получаете пустую строку.
s1 = 'helloabc'
s2 = 'world'
s3 = ''
for i in range(max(len(s1), len(s2))):
s3 = s1[i:i+1] + s2[i:i+1] + s3
print(s3)
выход
cbaodlllreohw
Мы получаем тот же результат, если
s1 = 'hello'
s2 = 'worldabc'
Но вернемся к случаю, когда мы уверены, что s1
& s2
имеют те такая же длина, t здесь больше питонических способов сделать это. В Python обычно предпочитают итерацию непосредственно над коллекциями, а не через итерацию через индексы. Для итерации по двум или более коллекциям мы используем функцию zip
, которая дает кортежи передаваемых ей итераторов, останавливаясь, когда заканчивается самый короткий итератор из элементов.
s1 = 'hello'
s2 = 'world'
s3 = ''
for u, v in zip(s1, s2):
s3 = u + v + s3
print(s3)
выход
odlllreohw
«учебник» способ сделать это состоит в использовании список понимание, чтобы создать список пар символов из s1
& s2
, функция reversed
итерировать назад по этому списку и метод str.join
, чтобы объединить их в одну строку.
s3 = ''.join(reversed([u + v for u, v in zip(s1, s2)]))
Мы могли бы также использовать расширенную нарезку, чтобы полностью изменить список, но с помощью reversed
итератора является более эффективным, так как не нужно строить копию списка (конечно, это не имеет большого значения, когда список невелик).
s3 = ''.join([u + v for u, v in zip(s1, s2)][::-1])
Вы можете перевернуть строку с помощью функции 'reverse()' или вы можете индексировать обратную сторону с помощью 'range (len (s2), 0, -1)'. – tdelaney
Вы можете поменять строку с помощью нотации среза с отрицательным шагом - '' 's [:: - 1]' '' – wwii