2017-01-26 2 views
1

Данные две строки s1 и s2 такой же длины.Python: петли и шнуры

Создать новую строку, состоящую из последнего символа s1 с последующим последнего символа s2, а затем второй, чтобы последний символ s1, а затем второй, чтобы последний символ s2, и так далее (в другими словами, новая строка должна состоять из чередующихся символов с обратной стороны s1 и s2).

Например,

, если s1="hello" и s2="world", то s3 должно быть "odlllreohw".

Я попытался это:

s3 = '' 
for i in range(0, min(len(s1), len(s2))): 
    s3 = s3 + s1[i] + s2[i] 

, но я не знаю, как у него реверс письма от s1 и s2.

+1

Вы можете перевернуть строку с помощью функции 'reverse()' или вы можете индексировать обратную сторону с помощью 'range (len (s2), 0, -1)'. – tdelaney

+0

Вы можете поменять строку с помощью нотации среза с отрицательным шагом - '' 's [:: - 1]' '' – wwii

ответ

1

В python вы можете получить доступ к строке или списку, используя отрицательное значение для смещения от конца. Например:

s3 = s3 + s1[-1] + s2[-2] 

Извлечет последний символ s1, а второй - последний символ s2.

0

Попробуйте

str1="hello" 
str2="world" 
str3="" 
for c,d in zip(reversed(str1),reversed(str2)): 
    str3+=c+d 
print (str3) 

Выход

odlllreohw 
0

Вы также можете использовать ломтик обозначения:

>>> str = "Hello" 
>>> print str[::-1] 
'olleH' 
0

Одно из решений линия может быть:

s3="".join([s1[::-1][x]+s2[::-1][x] for x in range(len(s1))]) 
0

Спецификация проблемы говорит о том, что 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]) 
Смежные вопросы