Один из способов сделать это - разделить строку на разделенный пробелами список имен, получить итератор для списка, затем перебрать итератор в цикле for, собрать первое имя и затем перейти к циклу итератора до получить второе имя тоже.
names = installers.split()
it = iter(names)
out = []
for name in it:
next_name = next(it)
full_name = '{} {}'.format(name, next_name)
out.append(full_name)
fixed = ', '.join(out)
print fixed
'Joe Bloggs, John Murphy, Peter Smith'
Однострочная версия этого будет
>>> ', '.join(' '.join(s) for s in zip(*[iter(installers.split())]*2))
'Joe Bloggs, John Murphy, Peter Smith'
это работает путем создания списка, который дважды содержит один итератор , поэтому функция zip возвращает обе части имени. См. Также рецепт группировщика из рецептов itertools .