Есть ли пифонический способ вставить элемент в каждый второй элемент в строке?
У меня есть строка: "aabbccdd", и я хочу, чтобы конечный результат был "aa-bb-cc-dd".
Я не уверен, как бы я это сделал.
Есть ли пифонический способ вставить элемент в каждый второй элемент в строке?
У меня есть строка: "aabbccdd", и я хочу, чтобы конечный результат был "aa-bb-cc-dd".
Я не уверен, как бы я это сделал.
Предположим, что длина строки всегда четное число,
>>> 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'
Первая часть кода - это одна и та же идея, но потребляет меньше памяти, если строка длинная.
>>> s = 'aabbccdd'
>>> '-'.join(s[i:i+2] for i in range(0, len(s), 2))
'aa-bb-cc-dd'
Если вы хотите сохранить последний символ, если строка имеет нечетную длину, вы можете изменить ответ 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'
Этот однострочный трюк делает трюк. Он упустит последний символ, если ваша строка содержит нечетное число символов.
"-".join([''.join(item) for item in zip(mystring1[::2],mystring1[1::2])])
Вот один способ понимания списка с условным значением, зависящим от модуля перечисления, нечетный последний символ будет только в группе:
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
"""