Muito bem!
Código com lógica muito boa, e padrão exemplar.
Algumas dicas:
chaves = dict(participantes)
Essa linha torna-se desnecessária, pois participantes já é um dicionário, e possui um nome muito mais descritivo que chaves.
lista_chaves = list(chaves.keys())
Essa linha também não seria necessária, pois você pode iterar diretamente das chaves.keys(), sem ter que converter para listas.
for item in lista_chaves:
nomes += (str(item)+",")
idades += ((str(chaves[item])) + ",")
composto += ((str(item)+": ") + ((str(chaves[item])) + "\n"))
Primeiramente quanto a nomenclatura, seria melhor algo como for chave in lista_chaves:
ou, melhor ainda, for participante in participantes:
ou for participante in participante.keys():
caso queira deixar explícito.
Além disso, temos algumas operações redundantes, como aplicar conversão para string em item, que sempre são strings.
Poderia-se tanto fazer algo como:
nomes += item + ","
Ou:
nomes += f"{item},"
Por fim, quanto aos prints finais, podemos simplificar slices que começam do primeiro item, não colocando o primeiro item, do seguinte modo: [:-1]
Além disso, o \n poderia estar na própria string no final, ficando assim, por exemplo:
print("Participantes e suas idades :\n", composto[:-1])
De um modo ou de outro, esses não são erros, são apenas dicas de outros modos de fazer. Porém, com relação a nomenclatura das variáveis, isso é importante. Variáveis devem sempre ter nomes descritivas do que elas representam.
Ademais, parabéns pelo código!