Предположим, что длина строки всегда четное число,
>>> 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'
Первый фрагмент кода является той же идеей, но потребляет меньше памяти, если строка длинная.