Как добавить две строки по индексу
Я пытался много раз, но не смог этого сделать.
Вот пример:
print( concat_corresponding( "12345", "6789XYZ" ) )
Желаемый результат:
162738495XYZ
6 ответов
Это один из способов itertools
:
from itertools import chain, zip_longest
a = "12345"
b = "6789XYZ"
res = ''.join(list(chain.from_iterable(zip_longest(a, b, fillvalue=''))))
# '162738495XYZ'
Обратите внимание, что преобразование списка не требуется, но повышает производительность.
from itertools import izip_longest
''.join(['%s%s' % (x ,y)\
for x,y in izip_longest("12345","6789XYZ", fillvalue='')])
## Was: ''.join(['%s%s' % (x if x else '',y if y else '') \
## for x,y in izip_longest("12345","6789XYZ")])
Чтобы сломать это немного:
- встроенная функция zip() выполняет сжатие только в более короткие последовательности; поэтому мы используем izip_longest() из модуля стандартной библиотеки itertools
- izip_longest() дополняет сгенерированные последовательности значением None по умолчанию; поэтому мы добавляем необязательный аргумент fillvalue='' (ключевое слово)
- все полученные подстроки просто объединяются, чтобы сформировать ваши результаты.
Вы можете поднять список понимания, присоединиться и заархивировать:
te1 = "12345"
te2 = "6789XYZ"
print (''.join( ''.join(x) for x in zip(te1,te2)) + (te1[len(te2):] if len(te1)>len(te2) else te2[len(te1):]))
# ^^^^ this part adds the remainer of longer list to result
выход:
162738495XYZ
https://docs.python.org/3/library/functions.html
https://docs.python.org/3/library/stdtypes.html
Объяснение:
zip объединяет символы по позициям, остальные превращают список пар обратно в строку.
Zip работает только для более короткой строки - вы можете переключиться на itertools.zip_longest ( см. Ответ JimDennis) или добавить часть длинных списков (как я сделал здесь)
Я думаю, что это решение немного чище и использует преимущества fillvalue
Ключевой аргумент для itertools.zip_longest
,
from itertools import zip_longest
''.join(a+b for a, b in zip_longest(s1, s2, fillvalue=''))
Еще один способ сделать это заключается в следующем:
def concat_corresponding(string1, string2):
minimum, maximum = sorted([string1, string2], key=len)
return "".join(string1[i]+string2[i] for i in range(len(minimum))) + maximum[len(minimum):]
print(concat_corresponding( "12345", "6789XYZ" ))
Выход:
162738495XYZ
Этот простой, но полезный
str1="12345"
str2="6789XYZ"
str3=""
i=0
for i, ch in enumerate(zip(str1, str2)):
str3 += ch[0] + ch[1]
if len(str1) < len(str2):
str3 += str2[i+1:]
else:
str3 += str1[i+1:]
print(str3)