Вот способ сделать это:
l1=['a', 'b']
l2=['b', 'c', 'd', 'e']
l3=['a', 'd', 'e']
l4=['b', 'e']
Получить вложенный список из списков:
l = [i for i in [l1,l2,l3,l4]]
Получить все комбинации в каждом списке, используя itertools.combinations
:
c = [list(itertools.combinations(i,2)) for i in l]
#[[('a', 'b')],
#[('b', 'c'), ('b', 'd'), ('b', 'e'), ('c', 'd'), ('c', 'e'), ('d', 'e')],
#[('a', 'd'), ('a', 'e'), ('d', 'e')],
#[('b', 'e')]]
Сгладить вложенные списки.Обратите внимание, что каждый элемент добавляется в исходном и обратном порядке, используя chain.from_iterable((i, i[::-1])
.
a = list(chain.from_iterable((i, i[::-1]) for c_ in c for i in c_))
Используйте pivot_table
и агрегируйте по size
, чтобы сгенерировать матрицу совпадений из результата
df = pd.DataFrame(a)
pd.pivot_table(df, index=0, columns=1, aggfunc='size', fill_value=0)
1 a b c d e
0
a 0.0 1.0 0.0 1.0 1.0
b 1.0 0.0 1.0 1.0 2.0
c 0.0 1.0 0.0 1.0 1.0
d 1.0 1.0 1.0 0.0 2.0
e 1.0 2.0 1.0 2.0 0.0