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.
01.
def
soma_vec_esparso_b(vec_1, vec_2):
02.
comp
=
vec_1[
'len'
]
03.
# Converte dicionários em listas
04.
list_1
=
[vec_1.get(i,
0
)
for
i
in
range(comp) ]
05.
list_2
=
[vec_2.get(i,
0
)
for
i
in
range(comp)]
06.
# soma listas
07.
list
=
[list_1[i]
+
list_2[i]
for
i
in
range(comp)]
08.
# constrói dicionário
09.
dic
=
{i: list[i]
for
i
in
range(comp)
if
list[i] >
0
}
10.
dic[
'len'
]
=
comp
11.
return
dic
Então qual seria a solução baseada em dicionários? Como vão ver, simples e curta.
1.
def
soma_vec_esparso(vec_1, vec_2):
2.
vec_3
=
{}
3.
vec_3.update(vec_2)
4.
for
ch1,val1
in
vec_1.items():
5.
if
ch1 !
=
'len'
:
# isinstance(ch1,int)
6.
vec_3[ch1]
=
val1
+
vec_3.get(ch1,
0
)
7.
return
vec_3