Найти - Пользователи
Полная версия: Как выбрать из словаря все ключи которые имеют хотябы одно одинаковое значение
Начало » Python для новичков » Как выбрать из словаря все ключи которые имеют хотябы одно одинаковое значение
1
Lena13_08
мне нужно выбрать все пары (key1,key2) которые имеют хотябы одно одинаковое значение
вот например у меня есть дневник
dict = { 'abc':[a, b], 'cdf':[b], 'gh':[a], 'fh':[g], 'hfz':[g]}
Я могу создать всевозможные пары с библиотекой itertools
 pairs=list(itertools.combinations(dict.keys(),2))

Это даст мне пары:
(abc,cdf) #имеют
(cdf,gh)
(cdf,fh)
(cdf,hfz)
(abc,gh)#имеют
(abc,fh)
(abc,hfz)
(gh,fh)
(gh,hfz)
(fh,hfz)#имеют
Но из этих пар мне нужны только те что имеют общее значение тоисть:
(abc,cdf) #имеют b
(abc,gh)#имеют a
(fh,hfz)#имеют g

PS. Для лучшей визуализации проблемы: я создаю сеть где ключи это вершины которые будут иметь ребро только в стучае того если у них есть общее значение
Isem
 from itertools import combinations
dct = { 'abc':{a, b}, 'cdf':{b}, 'gh':{a}, 'fh':{g}, 'hfz':{g}}
for p1, p2 in combinations(dct, 2):
    if dct[p1] & dct[p2]: print(p1, p2, sep = ', ')

Здесь важно, чтобы значения в словаре были множествами. Если принципиально, что изначально они не множества, то просто делаем их таковыми:
 dct = {k:set(v) for k,v in dct.items()}
Или это можно делать при проверке, но это гораздо менее эффективно:
     if set((dct[p1]) & set(dct[p2]): print(p1, p2, sep = ', ')

Если словарь очень большой, то более эффективный алгоритм - это “задом наперед”. То есть сначала надо поменять значения и ключи в словаре местами, а потом просто вывести те значения, которых 2 и более (при этом если их больше двух, то перебрать все разные пары). Но это чуть сложнее.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB