Pythonic способ вставить каждые 2 элемента в строку - PullRequest
29 голосов
/ 15 июля 2010

Есть ли питонный способ вставить элемент в каждый второй элемент в строке?

У меня есть строка: 'aabbccdd', и я хочу, чтобы конечный результат был 'aa-bb-cc-dd'.

Я не уверен, как бы я поступил так.

Ответы [ 5 ]

39 голосов
/ 15 июля 2010
>>> s = 'aabbccdd'
>>> '-'.join(s[i:i+2] for i in range(0, len(s), 2))
'aa-bb-cc-dd'
37 голосов
/ 15 июля 2010

Предположим, что длина строки всегда четное число,

>>> s = '12345678'
>>> t = iter(s)
>>> '-'.join(a+b for a,b in zip(t, t))
'12-34-56-78'

t также можно удалить с помощью

>>> '-'.join(a+b for a,b in zip(s[::2], s[1::2]))
'12-34-56-78'

Алгоритм состоит в том, чтобы сгруппировать строку в пары, а затем объединить их с символом -.

Код написан так. Во-первых, он разбит на нечетные и четные цифры.

>>> s[::2], s[1::2]
('1357', '2468')

Затем функция zip используется для объединения их в итерируемые кортежи.

>>> list( zip(s[::2], s[1::2]) )
[('1', '2'), ('3', '4'), ('5', '6'), ('7', '8')]

Но кортежи - это не то, что мы хотим. Это должен быть список строк. Это цель понимания списка

>>> [a+b for a,b in zip(s[::2], s[1::2])]
['12', '34', '56', '78']

Наконец, мы используем str.join(), чтобы объединить список.

>>> '-'.join(a+b for a,b in zip(s[::2], s[1::2]))
'12-34-56-78'

Первый фрагмент кода является той же идеей, но потребляет меньше памяти, если строка длинная.

4 голосов
/ 15 июля 2010

Если вы хотите сохранить последний символ, если строка имеет нечетную длину, вы можете изменить ответ KennyTM, используя itertools.izip_longest :

>>> s = "aabbccd"
>>> from itertools import izip_longest
>>> '-'.join(a+b for a,b in izip_longest(s[::2], s[1::2], fillvalue=""))
'aa-bb-cc-d'

или

>>> t = iter(s)
>>> '-'.join(a+b  for a,b in izip_longest(t, t, fillvalue=""))
'aa-bb-cc-d'
0 голосов
/ 15 июля 2010

Вот один способ понимания списка с условным значением в зависимости от модуля перечисления, последний нечетный символ будет в одной группе:

for s  in ['aabbccdd','aabbccdde']:
    print(''.join([ char if not ind or ind % 2 else '-' + char
                    for ind,char in enumerate(s)
                    ]
                  )
          )
""" Output:
aa-bb-cc-dd
aa-bb-cc-dd-e
"""
0 голосов
/ 15 июля 2010

Этот однострочник делает свое дело.Последний символ будет пропущен, если в вашей строке нечетное количество символов.

"-".join([''.join(item) for item in zip(mystring1[::2],mystring1[1::2])])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...