Однострочное решение:
string.replace('@@@', '{}', len(kv)).format(*kv.values())
Краткое объяснение:
- Заменить все строки
'@@@'
на идентификатор форматирования строки python '{}'
.len(kv)
уменьшает количество замен до длины dict, избегая IndexError
, когда в dict меньше элементов, чем число '@@@'
в строке - извлекает значения словаря с помощью
kv.values()
- распаковывает значения словаря с помощью
*kv.values()
и передает это в качестве аргумента методу string format
.
Пример выполнения кода:
Ввод
string = 'asfd @@@ fdsfd @@@ ffds @@@ asdf'
kv = {'1': 'hi', '2': 'there', '3': 'bla'}
И вывод
string.replace('@@@', '{}', len(kv)).format(*kv.values())
#Out: 'asfd hi fdsfd there ffds bla asdf'
Преимущество этого решения: нет явного зацикливания (явное зацикливание почти всегда плохая идея в python) и только одна строка кода.Кроме того, также работает , когда число '@@@'
меньше ** или больше, чем число значений в kv
**, когда параметр count
в str.replace
указано.
Это приводит к окончательному и 99% отказоустойчивому варианту моего решения с использованием len
изречения в качестве count
аргумент в replace
:
string.replace('@@@', '{}', len(kv)).format(*kv.values())