Das respostas dadas no teste, quase todos(as) optaram por transformar os dois vectores representados por dicionários em listas, seguido da soma das duas listas, par finalmente depois construir o dicionário resultado. Se pensarmos um pouco, isto é tudo menos boa programação, porque precisamente destrói o que se ganha em usar uma representação baseada em dicionários: espaço e tempo! Mesmo assim, as soluções apresentadas têm muitas deficiências (por exemplo, recurso errado a isdigit() ou a type(x) == int, em vez de isinstance(x,int)). Eis uma solução possível para essa abordagem.
def soma_vec_esparso_b(vec_1, vec_2): comp = vec_1['len'] # Converte dicionários em listas list_1 = [vec_1.get(i,0) for i in range(comp) ] list_2 = [vec_2.get(i,0) for i in range(comp)] # soma listas list = [list_1[i] + list_2[i] for i in range(comp)] # constrói dicionário dic = {i: list[i] for i in range(comp) if list[i] > 0} dic['len'] = comp return dicFazemos uso de listas e dicionários por compreensão, que nos permite um código curto.Claro que podem ser substituídas por ciclos normais.
Então qual seria a solução baseada em dicionários? Como vão ver, simples e curta.
def soma_vec_esparso(vec_1, vec_2): vec_3 = {} vec_3.update(vec_2) for ch1,val1 in vec_1.items(): if ch1 != 'len': # isinstance(ch1,int) vec_3[ch1] = val1 + vec_3.get(ch1,0) return vec_3A ideia é começar por copiar um dos dicionários para a solução usando o método update ( isso inclui a chave ‘len’), e depois verificar os elementos relevantes (isto é, diferentes de ‘len’) do outro vector efectuando a soma. Em comentário, mostramos que podemos fazer o teste para saber se é ‘len’ ou um número de um modo mais geral.