2016-12-07 2 views
3

Я хочу заменить каждый экземпляр символа в одной строке символом с тем же индексом в другой строке. Если в этом индексе не существует символа, оставьте его как есть.Как изящно заменить определенные символы в одной строке символами в другом в том же индексе?

Вот мое решение с пониманием списка (Python 3):

string1 = "food is delicious" 
string2 = "orange is not delicious" 
string3 = "".join([string2[i] if i<len(string2) and c=="o" else c for i, c in enumerate(string1)]) 
print(string3) 

Результат

frad is delicidus 

Он чувствует, что должен быть лучший способ, хотя, например, с использованием str.replace каким-то образом. Есть идеи?

ответ

2

Вы можете использовать itertools.zip_longest для итерации обеих строк, до тех пор, пока не будет исчерпан самый длинный из них. Меньшая строка будет заполнена fillvalue

>>> s1 = "food is delicious" 
>>> s2 = "orange is not delicious" 

>>> from itertools import zip_longest 
>>> "".join([c2 if (c1 == 'o' and c2) else c1 for c1, c2 in zip_longest(s1, s2, fillvalue='')]) 
'frad is delicidus' 
1

Кратчайший решение я нашел:

a="food is delicious" 
b="orange is not delicious" 
''.join(y if x is 'o' else x for (x, y) in zip(a, b)) 
>>>> frad is delicidus 

Обратите внимание, что строка результата будет иметь длину более короткого из двух, так как в противном случае это будет определено, что заменить оставшиеся o с с.

+3

** Не используйте ** для сравнения объектов. – thefourtheye

+0

Кроме того, это не будет работать, если 'a' длиннее' b'. – thefourtheye