Ламерское решение, но должно работать. Есть функции exal и exec, они выполняют строку как строку кода.
тогда
1. сначала разбить first_.... через split в ['first', 'sec', 'x']
2. создать словарь somedict={}
3. задать значение например value=999
4. создать и выполнить выражение
exec ( "somedict = {'"+"':{'".join(x)+"'"+':'+str(value)+'}'*(len(x)) )
после этого выполнится somedict={'first':{'sec':{'x':999}}}
Но если хочется найти нормальное решение, рекомендую на инглише поискать, возможно что-то есть через рекурсию или какие-то модули
апдейт:
def mylist(L):
if not L:
return (999)
else:
return {L[0]: mylist(L[1:])}
mylist(x)
Out[120]: {'first': {'sec': {'x': {'y': {'z': 999}}}}}