Вы также можете использовать product
из itertools
:
from itertools import product
result = {(a,b): self.calculate_similarity(vec_a, vec_b)
if a[0] != b[0] else 1
for ((a, vec_a) ,(b, vec_b)) in product(a_list, b_list)}
Обратите внимание, что вы получаете один словарь с индексом кортежей вместо двух избыточных словарей.
РЕДАКТИРОВАНИЕ: чтобы вернуть эти два словаря, вы можете использовать dict compethsion:
a2b = {a: {_b:v for (_a,_b), v in result.items() if _a==a} for (a,b) in result.keys()}
b2a = {b: {_a:v for (_a,_b), v in result.items() if _b==b} for (a,b) in result.keys()}
, чтобы получить список значений сходства, вы можете использовать ab_sim = list(result.values())