reduce
функция на каждой текущей итерации опирается на предыдущий элемент / расчет (характер всех уменьшение подпрограмм), поэтому вы получили 12
в началерезультирующая строка: на 1-ом проходе элемент был 5~geeks3~are
с длиной 12
, который использовался / добавлялся на следующей итерации.
Вместо этого вы можете использовать простой последовательный подход:
lst = ["geeks", "are", "awesome"]
res = ''.join('{}~{}'.format(str(len(s)), s) for s in lst)
print(res) # 5~geeks3~are7~awesome