Если вы упростите задачу только для кластеров длиной 2 (т. Е. Пар словарей), она станет немного понятнее: генерация подпоследовательностей фиксированной длины из заданной итерации - это точно работа itertools.combination:
>>> list(itertools.combinations(d, 2))
[('g5', 'g4'), ('g5', 'g3'), ('g5', 'g2'), ('g5', 'g1'), ('g4', 'g3'), ('g4', 'g
2'), ('g4', 'g1'), ('g3', 'g2'), ('g3', 'g1'), ('g2', 'g1')]
Мы можем увидеть количество ключей, общих для всех словарей, поняв, что представление d.keys () ведет себя как набор (в Python 3; в Python 2 это может быть список):
>>> d['g1'].keys() & d['g2'].keys()
{'p3', 'p1', 'p4'}
& - это оператор пересечения множества - он дает нам набор всех элементов, которые имеют эти множества общего.Поэтому мы можем проверить, что существует как минимум два из них, проверив длину этого набора, что дает нам:
>>> common_pairs = [[x,y] for x,y in itertools.combinations(d, 2)
if len(d[x].keys() & d[y].keys()) >= 2]
>>> common_pairs
[['g2', 'g1']]
Решить для неизвестного размера кластера немного сложнее - мы не можем использовать оператор &непосредственно, если мы не жестко это кодируемК счастью, класс set предоставляет нам метод для пересечения множеств n в форме set.intersection.Он не примет экземпляр dict_keys, но вы можете легко исправить это с помощью вызова set:
>>> set.intersection(d['g1'].keys(), d['g2'].keys(), d['g5'].keys())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: descriptor 'intersection' requires a 'set' object but received a 'dict_keys'
>>> set.intersection(set(d['g1']), set(d['g1']), set(d['g5']))
{'p1'}
Вы должны иметь возможность обобщить это для кластеров размером от 2 до n довольно тривиально.