как «женить» две строки в питоне? - PullRequest
2 голосов
/ 23 августа 2010

Каков разумный способ смешать две строки в python?

Мне нужно что-то, чтобы вставить одну строку в другую с указанными (по умолчанию = 1) интервалами:

>>> aa = 'abcdefghijkl'
>>> bb = mix(aa)
>>> bb
'a b c d e f g h i j k l '
>>> cc = mix(bb,'\n',8)
>>> print cc
a b c d 
e f g h 
i j k l 

Существует ли элегантный способ написания кода «mix», который будет принимать 1 обязательный параметр (строку для работы) и два необязательных: разделитель для вставки, начиная со второй позиции внутри строки (может быть длиннее одного символа, по умолчаниюодин пробел) и длину каждого среза первоначально переданной строки для вставки разделителя (по умолчанию 1 - это означает, что после каждого исходного символа из переданной строки будет вставлена ​​строка, которая была вторым параметром).

Ответы [ 3 ]

6 голосов
/ 23 августа 2010
def mix(s, c=' ', n=1):
    return ''.join(s[i:i+n]+c for i in range(0,len(s),n))
2 голосов
/ 23 августа 2010

Из itertools есть рецепт 'grouper', показанный здесь:

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return itertools.izip_longest(fillvalue=fillvalue, *args)

Тогда функция, которую вы хотите, давайте назовем ее mix, благодаря gnibbler, выглядит как

def mix(s, c=' ', n=1):
    return c.join(''.join(seq) for seq in grouper(n, s, '')) + c

Я предпочитаю его ответу Гнибблера, потому что его легче понять (и написать), так как он рассматривается в терминах существующей grouper функции, которая используется для подобных вещей.

0 голосов
/ 24 августа 2010
def mix(seq,sep=' ',dist=1):
    return sep.join(seq[i*dist:i*dist+dist]
                    for i in range(len(seq)/dist+1))

def take_n(seq,n):
    for i in range(len(seq)/n+1):
        yield seq[i*n:i*n+n]

def mixit(mystring, sep=' ', dist=1):
    return sep.join(list(take_n(mystring,dist)))

aa = 'abcdefghijkl'
bb = mix(aa)
print bb
cc = mix(bb,'\n', dist=8)
print cc

print mixit(aa)
print mixit(mixit(aa),'\n',8)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...