Есть и другие хорошие ответы, если у вас есть список ключей.Я заметил, что ваш пример ищет первое строковое значение.Если это всегда так, вот решение, которое будет работать без списка ключей:
def setval(d, val):
for i in d:
if isinstance(d[i], dict):
return setval(d[i], val)
if isinstance(d[i], str):
d[i] = val
return
return None
setval(d, 'winner')
print(d)
В качестве альтернативы, если вы хотите использовать список для указания пути, вот рекурсивный подход:
def setvalat(d, l, val):
if len(l) > 1:
setvalat(d[l[0]], l[1:], val)
else:
d[l[0]] = val
setvalat(d, ['a', 'y', 'z', '1'], 'winner')
print(d)